GNU/Linux >> Tutoriales Linux >  >> Linux

Versionado automático al cambiar el archivo (modificar/crear/eliminar)

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.


Linux
  1. Cree una bóveda de archivos cifrados en Linux

  2. Manera de modificar un archivo en el lugar?

  3. ¿Hacer `cortar` cambiar un archivo en su lugar?

  4. ¿Qué cuenta como modificación o cambio de archivo?

  5. Permitir al propietario crear y leer archivos, pero no modificarlos ni eliminarlos

Cómo crear un archivo en Linux

Cómo crear un archivo Tar Gz

Comando Chown en Linux (Cambiar la propiedad del archivo)

4 formas de crear un nuevo archivo en Linux

¿Cómo crear un archivo en Linux desde la ventana de terminal?

Crear un PEM a partir de un archivo PPK