GNU/Linux >> Tutoriels Linux >  >> Linux

Gestion automatique des versions lors du changement de fichier (modifier/créer/supprimer)

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.


Linux
  1. Manière de modifier un fichier sur place ?

  2. Faire "couper" Modifier un fichier en place ?

  3. Vim :créer un fichier avec +x bit ?

  4. Qu'est-ce qui compte comme une modification ou un changement de fichier ?

  5. Comment créer un fichier temporaire en script shell ?

Comment créer un fichier sous Linux

Comment créer un fichier Tar Gz

Commande Chown sous Linux (modifier la propriété du fichier)

4 façons de créer un nouveau fichier sous Linux

Comment créer un fichier sous Linux à partir de la fenêtre du terminal ?

Créer un PEM à partir d'un fichier PPK