GNU/Linux >> Linux Esercitazione >  >> Linux

Versione automatica al cambio di file (modifica/crea/cancella)

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.


Linux
  1. Come creare uno scambio in Linux

  2. Come creare un file di scambio in Linux

  3. Cosa conta come una modifica o una modifica del file?

  4. Come creare un file temporaneo nello script della shell?

  5. Cambia chi è in grado di eseguire il Chmod?

Crea un archivio di file crittografato su Linux

Come creare un file in Linux

Come creare file Tar Gz

Comando Chown in Linux (Modifica proprietà file)

4 modi per creare un nuovo file in Linux

Modifica la data di creazione del file