1. Método de propósito general usando bazar e inotify
Esto no lo he probado, pero encontré este escrito que hace uso de bzr
(bazar) &inotifywait
para monitorear un directorio y controlar la versión de los archivos en él usando bazar.
Este script hace todo el trabajo de observar el directorio en busca de cambios:
#!/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. Administrar /etc
Para el caso especial de administrar el /etc
de su sistema directorio, puede usar la aplicación etckeeper.
etckeeper es una colección de herramientas para permitir que /etc se almacene en un repositorio git, mercurial, darcs o bzr. Se conecta con apt (y otros administradores de paquetes, incluidos yum y pacman-g2) para confirmar automáticamente los cambios realizados en /etc durante las actualizaciones de paquetes. Realiza un seguimiento de los metadatos de archivos que los sistemas de control de revisión normalmente no admiten, pero que son importantes para /etc, como los permisos de /etc/shadow. Es bastante modular y configurable, además de ser fácil de usar si comprende los conceptos básicos del trabajo con el control de revisión.
Aquí hay un buen tutorial para comenzar.
3. Usando git e incron
Esta técnica hace uso de git
y incron
. Para este método necesitas hacer lo siguiente:
A. Hacer un repositorio
% mkdir $HOME/git
% cd $HOME/git
% git init
B. Crea un $HOME/bin/git-autocommit
guión
#!/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. Agregar una entrada a incrontab
% sudo incrontab -e $HOME/srv IN_MODIFY,IN_CREATE,IN_MOVED_FROM,IN_MOVED_TO $HOME/bin/git-autocommit
4. Usando Flashbake
Otra opción es utilizar una herramienta como Flashbake. Flashbake es el sistema de control de versiones que usa Cory Doctorow (de la fama de BoingBoing) para escribir sus libros.
Flashbake usa git bajo el capó para realizar un seguimiento de los cambios, pero se encuentra en algún lugar entre hacer copias de seguridad automáticas y usar un sistema de control de versiones simple.
Cory quería que la versión incluyera indicaciones, instantáneas de dónde estaba en el momento en que se produjo una confirmación automática y lo que estaba pensando. Rápidamente esbocé una secuencia de comandos de Python para obtener la información contextual que quería y comencé a crear una secuencia de comandos de shell para controlar git, usando la salida de la secuencia de comandos de Python para el comentario de confirmación cuando un trabajo cron invocaba el contenedor de shell.
Recursos
- Revisión automática de archivos al cargar
Inmediatamente me viene a la mente ZFS. Puede crear instantáneas, y hay algunos proyectos para crear instantáneas automáticamente.
Creo que estás en el camino correcto con inotify
. Este artículo detalla su uso básico en un caso similar al tuyo. Sugeriría usarlo directamente o compilar una utilidad a nivel de kernel como fschange. Esto es algo complicado, pero luego podría vincular la detección de cambios a un git commit
o similar.
Esas soluciones tienen el problema de depender de soluciones de terceros algo imperfectas. Si no le importa ensuciarse las manos, NodeJS proporciona una excelente función multiplataforma (fs.watch) para este propósito exacto. Puede encontrar un tutorial básico sobre la visualización de archivos en busca de cambios en NodeJS aquí. En unas pocas docenas de líneas o menos, podría escribir algo que observe un directorio en busca de archivos, y luego se descargue (a través de child_process) y ejecute un git commit
o similar (o incluso incrementa manualmente un índice de archivo de versión, si le gusta el enfoque personalizado).
fs.watch
está respaldado por inotify
en Linux, pero es mucho más intuitivo de usar. Hay otros proyectos de NodeJS que envuelven esa funcionalidad de visualización de archivos en varios niveles de conveniencia, como este o este.