Como posso criar uma cópia “copy on change” de uma pasta no linux?

0

Eu tenho um conjunto de ferramentas para criar um projeto muito grande. Em vários estágios de alto nível, minhas ferramentas criam cópias do ambiente de criação (um diretório) para permitir que o usuário retorne a esse ponto.

Estou tentando acelerar essa operação de cópia (o espaço não é um grande problema, mas o tempo é), então gostaria de encontrar uma maneira de criar uma cópia do diretório de compilação que consiste inteiramente de links (soft ou hard ou semelhante) aos arquivos originais, mas isso nunca modificará os arquivos originais, mas criará cópias deles automaticamente quando estiverem (ou puderem ser) alterados.

Observação: essas ferramentas são para fazer uma compilação, portanto, os arquivos colaterais terão vida útil curta; não precisarão ser preservados por muito tempo e sempre podem ser recriados a partir do código original com o tempo. não tem considerado soluções de SCM como o Subversion.

    
por tletnes 21.05.2014 / 19:14

1 resposta

2

Um SCM pode ser usado para isso:

  1. Crie um repositório com apenas um único commit:

    git init
    git add .
    git commit -m "initial commit"
    
  2. Criar

  3. Reverter para o estado original

    git checkout -f   # discard modifications to committed files
    git clean -f -d   # delete files that were not committed
    

Para obter uma cópia em gravação real, você precisará de suporte em nível de sistema de arquivos. zfs permite criar instantâneos por sistema de arquivos (e é barato criar um sistema de arquivos zfs separado apenas para a raiz da compilação); em btrfs , o mesmo é feito através de subvolumes. Além disso, no btrfs, você tem um novo tipo de link chamado "reflinks", que são como hardlinks, mas com CoW.

btrfs subvolume create ~/build.base
[fill ~/build.base]
btrfs subvolume snapshot ~/build.base ~/build.temp
[run build in ~/build.temp]
btrfs subvolume delete ~/build.temp
    
por 21.05.2014 / 21:08