Come posso creare una copia di "copia su cambio" di una cartella in linux?


0

Ho una serie di strumenti per la costruzione di un progetto molto grande. In diversi livelli di alto livello, i miei strumenti creano copie dell'ambiente di costruzione (una directory) per consentire all'utente di tornare a quel punto.

Sto cercando di velocizzare questa operazione di copia (lo spazio non è un grosso problema, ma il tempo è), quindi mi piacerebbe trovare un modo per creare una copia della directory di build che consiste interamente di collegamenti (soft o hard o simili) a i file originali ma che non modificheranno mai i file originali, ma ne creeranno automaticamente copie quando sono (o potrebbero essere) cambiati.

Nota: questi strumenti servono a creare una build, quindi i file collaterali avranno una vita breve, non dovranno essere conservati per un lungo periodo e potranno sempre essere ricreati con il codice originale al costo del tempo, quindi non sono stato considerando soluzioni SCM come Subversion.


Non ho mai usato istantanee, ma un filesystem che supporta istantanee potrebbe essere la soluzione. en.wikipedia.org/wiki/Filesystem_snapshot#FS
mpy

1
Sembra un modo complesso per avere il controllo della versione. Perché non usare un VCS? (es. GIT)
Bruno9779

Come ho detto, la durata dei dati non è molto lunga (giorni o settimane), anche perché questo è un ambiente di costruzione alcune delle cartelle provengono effettivamente da altri SCM (git / svn), quindi il controllo dell'intera cosa in un SCM sarebbe implorando conflitti.
tletnes

Risposte:


2

Un SCM può essere usato per questo:

  1. Crea un repository con un solo commit:

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

  3. Ripristina allo stato originale

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

Per ottenere una vera copia-su-scrittura, avrai bisogno del supporto a livello di file system. zfs consente di creare istantanee per file system (ed è economico creare un file system zfs separato solo per la build root); nel btrfs, lo stesso è fatto attraverso sottovolumi. Inoltre, in btrfs, hai un nuovo tipo di collegamento chiamato "reflinks", che è come i collegamenti fisici, ma con 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.