Je cherche une implémentation (sous Linux) d'un mécanisme qui versionnerait automatiquement et de manière transparente toutes les modifications dans un répertoire (récursivement). Il s'agit d'un ajout (éventuellement de remplacement si toutes les fonctionnalités demandées sont disponibles) au versioning standard (SVN, git, ...)
Un produit sur MS Windows qui fait cela est AutoVer (pour avoir une meilleure idée des exigences). J'adorerais avoir quelque chose comme ça mais destiné à Linux dans un environnement non graphique.
J'ai vu qu'il y a quelques tentatives pour avoir cette fonctionnalité sur Linux, la plus proche que j'ai trouvée est la conversion automatique sur Subversion mais il n'est pas évident de l'implémenter sur des environnements existants (serveurs où, par exemple, les fichiers de configuration sont locaux).
Peut-être que quelque chose fonctionne avec inotify
?
Merci d'avance pour tout conseil! WoJ
Réponses:
1. Méthode à usage général utilisant bazar et inotify
Ceci n'est pas testé par moi mais j'ai trouvé cette écriture qui utilise
bzr
(bazaar) etinotifywait
pour surveiller un répertoire et contrôler la version des fichiers qu'il contient en utilisant bazaar.Ce script fait tout le travail de surveillance du répertoire pour les changements:
2. Gestion / etc
Pour le cas particulier de la gestion du
/etc
répertoire de votre système , vous pouvez utiliser l'application etckeeper .Voici un bon tutoriel pour vous aider à démarrer.
3. Utiliser git et incron
Cette technique utilise
git
etincron
. Pour cette méthode, vous devez effectuer les opérations suivantes:A. Faire un repo
B. Créez un
$HOME/bin/git-autocommit
scriptC. Ajouter une entrée à incrontab
4. Utilisation de Flashbake
Une autre option consiste à utiliser un outil comme Flashbake . Flashbake est le système de contrôle de version que Cory Doctorow (de la renommée BoingBoing) utilise pour écrire ses livres.
Flashbake utilise git sous le capot pour suivre les modifications, mais se situe entre la réalisation de sauvegardes automatisées et l'utilisation d'un système de contrôle de version simple vous-même.
Ressources
la source
Immédiatement, ZFS me vient à l'esprit. Il peut créer des instantanés - et il existe certains projets pour créer automatiquement des instantanés .
la source
Je pense que vous êtes sur la bonne voie avec
inotify
. Cet article détaille son utilisation de base dans un boîtier similaire au vôtre. Je suggère de l'utiliser soit directement, soit de compiler un utilitaire au niveau du noyau comme fschange . C'est quelque chose de compliqué, mais vous pouvez alors lier la détection des changements à ungit commit
ou similaire.Ces solutions ont toutes deux pour 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 ) à cet effet précis. Un tutoriel de base sur la surveillance des fichiers pour les changements 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 s'exécute (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 le roll-your- propre approche).fs.watch
est soutenu parinotify
Linux, mais est beaucoup plus intuitif à utiliser. Il existe d'autres projets NodeJS qui enveloppent cette fonctionnalité d'observation des fichiers à différents niveaux de commodité, comme celui-ci ou celui-ci .la source
inotify
. Mais merci.inotify (2) sur Linux ne pourra pas regarder une grande arborescence, mais le système de fichiers fusionné (monté dans un emplacement séparé) pourrait probablement le gérer, en traduisant les demandes de système de fichiers en appels svn ou git, ou en changeant directement les métadonnées svn / git.
C'est une idée très intéressante, mais je n'avais entendu parler d'aucune implémentation existante.
la source
Un tel script n'est pas difficile à écrire.
Mon contrôle de version préféré est git.
le script suivant devrait le faire:
soit faire vérifier périodiquement votre répertoire - ou si votre éditeur est appelable par script après avoir enregistré.
Mais si vous le faites comme ça, il peut être judicieux d'exclure les gros fichiers et peut-être certains "inutiles" comme les sauvegardes automatiques.
la source
SparkleShare ( http://sparkleshare.org ) est basé sur git et implémente une fonctionnalité de type Dropbox avec contrôle de version, mais vous devez configurer un serveur ssh (peut être localhost).
la source
Je vous recommande d'essayer NILFS. Référez-vous à la page À propos et vous pourrez rapidement décider si c'est celle-ci que vous recherchez ou non.
HTH
la source
Il y a aussi une manière de faire cela pour le pauvre en utilisant seulement rsync et un travail cron. Vous vous basez essentiellement sur la fonction de sauvegarde de rsync et utilisez deux chemins séparés plus un préfixe / suffixe pour garder une trace de vos fichiers.
Il ressemble plus ou moins à ceci: / usr / bin / rsync -a -A -X --backup --suffix =
date +".%Y-%m-%d_%H-%M-%S"
$ source_path $ backup_pathRésultat final: la modification d'un fichier appelé test_rsync dans le chemin source après l'exécution initiale entraînera la création d'un fichier appelé test_rsync.2017-02-09_11-00-01 dans le chemin de sauvegarde.
Il y a un tas de problèmes avec cela (cela fonctionne si vous avez seulement une quantité décente de fichiers et échouera pour les changements qui se produisent entre deux exécutions consécutives de rsync (1 minute dans mon cas)) mais cela peut être suffisant pour vos besoins.
Si nous parlons ici de partages de samba, une liste d'exclusion pourrait être en ordre, je n'y ai pas encore eu peur, j'ai peur.
Faites-moi savoir si vous améliorez cela.
la source
Voici un script Python3 qui utilise VMS comme le versionnage automatique des fichiers en utilisant un horodatage ajouté au nom du fichier d'origine lors de l'enregistrement.
J'ai mis un tas de commentaires dans le script et exécuté une demi-douzaine de tels scripts sur ma machine ubuntu, seuls les répertoires étant différents dans chaque version différente du script, de sorte que je versionne simultanément plusieurs répertoires. Aucune réelle pénalité sur les performances des machines.
! / usr / bin / env python3
print ("PROJECT FILES VERSIONING STARTED") print ("version_creation.py") #placer tout ce code dans le script de ce nom print ("run as .. 'python3 version_creation.py' from line command") print ("ctrl ' c 'pour arrêter ") print (" ") print (" Pour exécuter le programme en arrière-plan, tapez ci-dessous sur la ligne de commande, puis fermez la fenêtre. ") print (" nohup python3 version_creation.py ") print (" .... to arrêter le processus aller menu / administration / moniteur système ... et tuer python3 ") print (" ") print (" Toujours enregistrer les fichiers dans le répertoire 'ProjectFiles' et les fichiers de version ") print (" sera également créé dans ce répertoire . ") imprimer (" ") imprimer (" ") imprimer (" ") imprimer (" ")
importation shutil import os os import time
--- définissez l'intervalle de temps pour vérifier les nouveaux fichiers (en secondes) ci-dessous
- cet intervalle doit être plus petit que l'intervalle où les nouveaux fichiers apparaissent!
t = 10
--- définir le répertoire source (dr1) et le répertoire cible (dr2)
dr1 = "/ chemin / vers / répertoire_source"
dr2 = "/ chemin / vers / répertoire_cible"
import glob import os
dr1 = "/ home / michael / ProjectFiles" #les deux originaux et versions seront enregistrés dans ce répertoire
dr2 = "/ home / michael / ProjectFileVersions"
tandis que True:
imprimer ("Vide")
print ("1 Latest_file_path =", latest_file_path)
print ("2 originalname =", originalname)
print ("filecreation =", filecreation)
print ("fivesec_ago =", fivesec_ago)
print ("timedif =", timedif)
partager
le ci-dessous a été mis en place plus tôt et fonctionne mais j'aime beaucoup mieux le script python ci-dessus ...... (utilise python depuis environ 3 heures)
la source