Você pode efetivamente mesclar a diretórios com UnionFS sobrepondo os dois diretórios (chamados de branches neste contexto) em um único ponto de montagem.
Existem várias implementações do UnionFS; UnionFsFuse é um dos mais simples, já que é um aplicativo (em vez de um patch de kernel) .
O site contém um link para o arquivo. Compilar o código-fonte deve ser direto na maioria das distros.
No Ubuntu, por exemplo, basta instalar o pacote unionfs-fuse executando o seguinte comando:
sudo apt-get install unionfs-fuse
Uma vez instalado, você pode continuar a sobrepor os diretórios. Existem várias opções. Vou explicar brevemente os mais básicos:
-
O comando
unionfs-fuse foo:bar baz
sobrepõe o conteúdo dos diretórios foo e bar no diretório baz . 1
Esta sobreposição será somente leitura; qualquer tentativa de criar ou modificar um arquivo em baz resultará em um erro Permissão negada. . No entanto, você ainda poderá criar e modificar os arquivos dentro de foo e bar .
As colisões são tratadas de forma fixa: Se um arquivo existir em um ramo superior ( foo ), ele terá preferência sobre um arquivo com o mesmo nome em um ramo inferior (barra ).
-
O comando
union-fuse foo=RW:bar=RO baz
torna foo gravável e bar (somente leitura). Modificar arquivos de foo será possível, mas não será possível modificar arquivos de bar . Todos os arquivos recém-criados em baz aparecerão em foo .
-
O comando
union-fuse -ocow foo=RW:bar=RO baz
é semelhante ao último comando. A opção copy on write (
cow
) tem o efeito que tentar modificar um arquivo de bar dentro de baz resultará em uma cópia modificada do arquivo em foo (ou qualquer outro ramo gravável de nível superior). -
Com o comando
union-fuse foo=RW:bar=RW baz
tudo pode ser modificado. Novos arquivos serão criados no ramo superior ( foo ).
-
O comando
union-fuse foo=RO:bar=RW baz
permite modificar os arquivos de bar dentro de baz , mas nenhum novo arquivo pode ser criado.
-
O comando
sudo umount baz
desfaz a montagem da união.
Veja também: man unionfs-fuse
1 baz deve existir antes que este comando seja executado. Isso se aplica a todos os outros comandos também.