1. Obecná metoda využívající bazar &inotify
Toto není mnou testováno, ale našel jsem tento zápis, který používá bzr
(bazar) &inotifywait
sledovat adresář a kontrolovat verzi souborů v něm pomocí bazaru.
Tento skript provádí veškerou práci při sledování změn v adresáři:
#!/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. Správa /etc
Pro speciální případ správy /etc
vašeho systému adresář, můžete použít aplikaci etckeeper.
etckeeper je sada nástrojů, které umožňují uložit /etc do úložiště git, mercurial, darcs nebo bzr. Připojí se k apt (a dalším správcům balíčků včetně yum a pacman-g2) a automaticky potvrdí změny provedené v /etc během aktualizace balíčků. Sleduje metadata souborů, která systémy kontroly revize normálně nepodporují, ale to je důležité pro /etc, jako jsou oprávnění /etc/shadow. Je poměrně modulární a konfigurovatelný a zároveň se snadno používá, pokud rozumíte základům práce s řízením revizí.
Zde je dobrý návod, jak s tím začít.
3. Pomocí git a incronu
Tato technika využívá git
a incron
. Pro tuto metodu musíte provést následující:
A. Vytvořte repo
% mkdir $HOME/git
% cd $HOME/git
% git init
B. Vytvořte $HOME/bin/git-autocommit
skript
#!/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. Přidejte záznam do incrontab
% sudo incrontab -e $HOME/srv IN_MODIFY,IN_CREATE,IN_MOVED_FROM,IN_MOVED_TO $HOME/bin/git-autocommit
4. Pomocí Flashbake
Další možností je použít nástroj jako Flashbake. Flashbake je systém pro správu verzí, který Cory Doctorow (známý BoingBoing) používá k psaní svých knih.
Flashbake používá git pod kapotou ke sledování změn, ale je někde mezi automatickým zálohováním a vlastním používáním jednoduchého systému správy verzí.
Cory chtěl, aby verze obsahovala výzvy, snímky toho, kde se nacházel v době, kdy došlo k automatickému potvrzení, a co si myslel. Rychle načrtl skript Python, aby získal kontextové informace, které chtěl, a začal hackovat skript shellu k ovládání git pomocí výstupu skriptu Python pro komentář k odevzdání, když úloha cron vyvolala obal shellu.
Zdroje
- Automatická revize souboru při nahrání
Okamžitě mě napadá ZFS. Umí vytvářet snímky – a existují některé projekty pro automatické vytváření snímků.
Myslím, že jste s inotify
na správné cestě . Tento článek podrobně popisuje jeho základní použití v případě podobném tomu vašemu. Doporučil bych jej použít buď přímo, nebo zkompilovat nástroj na úrovni jádra, jako je fschange. To je trochu problém, ale pak byste mohli svázat detekci změn s git commit
nebo podobné.
Obě tato řešení mají problém spoléhat se na poněkud nedokonalá řešení třetích stran. Pokud vám nevadí špinit si ruce, NodeJS poskytuje vynikající multiplatformní zařízení (fs.watch) přesně pro tento účel. Základní výukový program pro sledování změn souborů v NodeJS naleznete zde. V několika desítkách řádků nebo méně byste mohli napsat něco, co sleduje adresář pro soubory, a pak to vyloučí (prostřednictvím child_process) a spustí git commit
nebo podobně (nebo dokonce manuálně zvýší index souboru verze, pokud se vám líbí přístup „roll-your-own“).
fs.watch
je podporována inotify
na linuxu, ale jeho použití je mnohem intuitivnější. Existují další projekty NodeJS, které tuto funkci sledování souborů zabalují do různých úrovní pohodlí, jako je tento nebo tento.