1. Méthode à usage général utilisant bazar &inotify
Ce n'est pas testé par moi mais j'ai trouvé cette écriture qui utilise bzr
(bazar) &inotifywait
pour surveiller un répertoire et contrôler la version des fichiers qu'il contient à l'aide de bazar.
Ce script effectue tout le travail de surveillance du répertoire pour les modifications :
#!/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. Gérer /etc
Pour le cas particulier de la gestion des /etc
de votre système répertoire, vous pouvez utiliser l'application etckeeper.
etckeeper est une collection d'outils permettant de stocker /etc dans un référentiel git, mercurial, darcs ou bzr. Il se connecte à apt (et à d'autres gestionnaires de packages, y compris yum et pacman-g2) pour valider automatiquement les modifications apportées à /etc lors des mises à niveau de packages. Il suit les métadonnées des fichiers que les systèmes de contrôle de révision ne prennent normalement pas en charge, mais qui sont importantes pour /etc, telles que les autorisations de /etc/shadow. Il est assez modulaire et configurable, tout en étant simple à utiliser si vous comprenez les bases de l'utilisation du contrôle de révision.
Voici un bon tutoriel pour vous aider à démarrer.
3. Utiliser git et incron
Cette technique utilise git
et incron
. Pour cette méthode, vous devez effectuer les opérations suivantes :
A. Faire un dépôt
% mkdir $HOME/git
% cd $HOME/git
% git init
B. Créer 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. Ajouter une entrée à incrontab
% sudo incrontab -e $HOME/srv IN_MODIFY,IN_CREATE,IN_MOVED_FROM,IN_MOVED_TO $HOME/bin/git-autocommit
4. Utiliser Flashbake
Une autre option consiste à utiliser un outil comme Flashbake. Flashbake est le système de contrôle de version que Cory Doctorow (du célèbre BoingBoing) utilise pour écrire ses livres.
Flashbake utilise git sous le capot pour suivre les modifications, mais se situe entre faire des sauvegardes automatisées et utiliser vous-même un système de contrôle de version simple.
Cory voulait que la version comporte des invites, des instantanés de l'endroit où il se trouvait au moment où un commit automatisé s'est produit et de ce qu'il pensait. J'ai rapidement esquissé un script Python pour extraire les informations contextuelles qu'il voulait et j'ai commencé à assembler un script shell pour piloter git, en utilisant la sortie du script Python pour le commentaire de validation lorsqu'une tâche cron invoquait le wrapper shell.
Ressources
- Révision automatique des fichiers lors du téléchargement
ZFS vient immédiatement à l'esprit. Il peut créer des instantanés - et il existe des projets pour créer automatiquement des instantanés.
Je pense que vous êtes sur la bonne voie avec inotify
. Cet article détaille son utilisation de base dans un cas similaire au vôtre. Je suggérerais de l'utiliser directement ou de compiler un utilitaire au niveau du noyau comme fschange. C'est un peu fastidieux, mais vous pouvez alors lier la détection des modifications à un git commit
ou similaire.
Ces solutions ont toutes deux le problème de s'appuyer sur des solutions tierces quelque peu imparfaites. Si cela ne vous dérange pas de vous salir les mains, NodeJS fournit une excellente installation multiplateforme (fs.watch) à cette fin précise. Un tutoriel de base sur la surveillance des fichiers pour les modifications dans NodeJS peut être trouvé ici. En quelques dizaines de lignes ou moins, vous pouvez écrire quelque chose qui surveille un répertoire pour les fichiers, puis les décortique (via child_process) et exécute un git commit
ou similaire (ou même incrémente manuellement un index de fichier de version, si vous aimez l'approche par vous-même).
fs.watch
est soutenu par inotify
sur Linux, mais est beaucoup plus intuitif à utiliser. Il existe d'autres projets NodeJS qui intègrent cette fonctionnalité de surveillance de fichiers à différents niveaux de commodité, comme celui-ci ou celui-ci.