1. Metodo generico che utilizza bazaar e inotify
Questo non è stato testato da me, ma ho trovato questo articolo che fa uso di bzr
(bazar) &inotifywait
per monitorare una directory e controllare la versione dei file in essa contenuti utilizzando bazaar.
Questo script fa tutto il lavoro di controllo della directory per i cambiamenti:
#!/bin/bash
# go to checkout repository folder you want to watch
cd path/to/www/parent/www
# start watching the directory for changes recusively, ignoring .bzr dir
# comment is made out of dir/filename
# no output is shown from this, but wrinting a filename instead of /dev/null
# would allow logging
inotifywait –exclude \.bzr -r -q -m -e CLOSE_WRITE \
–format=”bzr commit -m ‘autocommit for %w/%f’” ./ | \
sh 2>/dev/null 1>&2 &
# disown the pid, so the inotify thread will get free from parent process
# and will not be terminated with it
PID=`ps aux | grep inotify | grep CLOSE_WRITE | grep -v grep | awk ‘{print $2}’`
disown $PID
# this is for new files, not modifications, optional
inotifywait –exclude \.bzr -r -q -m -e CREATE \
–format=”bzr add *; bzr commit -m ‘new file added %w/%f’” ./ | \
sh 2>/dev/null 1>&2 &
PID=`ps aux | grep inotify | grep CREATE | grep -v grep | awk ‘{print $2}’`
disown $PID
exit 0;
2. Gestione di /etc
Per il caso speciale della gestione del /etc
del tuo sistema directory, puoi usare l'app etckeeper.
etckeeper è una raccolta di strumenti per consentire l'archiviazione di /etc in un repository git,mercurial, darcs o bzr. Si collega ad apt (e ad altri gestori di pacchetti inclusi yum e pacman-g2) per eseguire automaticamente il commit delle modifiche apportate a /etc durante gli aggiornamenti dei pacchetti. Tiene traccia dei metadati dei file che i sistemi di controllo di revisione normalmente non supportano, ma che sono importanti per /etc, come i permessi di /etc/shadow. È abbastanza modulare e configurabile, pur essendo semplice da usare se comprendi le basi per lavorare con il controllo di revisione.
Ecco un buon tutorial per iniziare.
3. Utilizzo di git e incron
Questa tecnica fa uso di git
e incron
. Per questo metodo devi fare quanto segue:
R. Crea un repository
% mkdir $HOME/git
% cd $HOME/git
% git init
B. Crea un $HOME/bin/git-autocommit
script
#!/bin/bash
REP_DIR="$HOME/git" # repository directory
NOTIFY_DIR="$HOME/srv" # directory to version
cd $REP_DIR
GIT_WORK_TREE=$NOTIFY_DIR /usr/bin/git add .
GIT_WORK_TREE=$NOTIFY_DIR /usr/bin/git commit -a -m "auto"
C. Aggiungi una voce a incrontab
% sudo incrontab -e $HOME/srv IN_MODIFY,IN_CREATE,IN_MOVED_FROM,IN_MOVED_TO $HOME/bin/git-autocommit
4. Utilizzo di Flashbake
Un'altra opzione è utilizzare uno strumento come Flashbake. Flashbake è il sistema di controllo della versione che Cory Doctorow (famoso per BoingBoing) usa per scrivere i suoi libri.
Flashbake utilizza git dietro le quinte per tenere traccia delle modifiche, ma è una via di mezzo tra l'esecuzione di backup automatici e l'utilizzo di un semplice sistema di controllo della versione.
Cory voleva che la versione contenesse suggerimenti, istantanee di dove si trovava nel momento in cui si verificava un commit automatico e cosa stava pensando. Ho rapidamente abbozzato uno script Python per estrarre le informazioni contestuali che desiderava e ho iniziato a mettere insieme uno script di shell per guidare git, usando l'output dello script Python per il commento di commit quando un cron job ha richiamato lo shell wrapper.
Risorse
- Revisione automatica del file al caricamento
Mi viene subito in mente ZFS. Può creare istantanee e ci sono alcuni progetti per creare automaticamente istantanee.
Penso che tu sia sulla strada giusta con inotify
. Questo articolo descrive in dettaglio il suo utilizzo di base in un caso simile al tuo. Suggerirei di usarlo direttamente o di compilare un'utilità a livello di kernel come fschange. Questa è una seccatura, ma potresti quindi associare il rilevamento delle modifiche a un git commit
o simili.
Entrambe queste soluzioni hanno il problema di affidarsi a soluzioni di terze parti alquanto imperfette. Se non ti dispiace sporcarti le mani, NodeJS offre un'eccellente struttura multipiattaforma (fs.watch) proprio per questo scopo. Un tutorial di base sulla visualizzazione dei file per le modifiche in NodeJS è disponibile qui. In poche dozzine di righe o meno, potresti scrivere qualcosa che controlli una directory per i file, quindi sgusci (tramite child_process) ed esegua un git commit
o simile (o anche incrementare manualmente un indice del file di versione, se ti piace l'approccio roll-your-own).
fs.watch
è supportato da inotify
su Linux, ma è molto più intuitivo da usare. Esistono altri progetti NodeJS che racchiudono la funzionalità di osservazione dei file in vari livelli di praticità, come questo o questo.