GNU/Linux >> Tutoriels Linux >  >> Linux

Conserver un historique de toutes les modifications apportées à un fichier texte

Donnez git une chance

Je ne vois pas pourquoi c'est un problème d'utiliser un outil puissant. Écrivez simplement un script bash simple qui exécute git périodiquement (via cron ou systemd minuteries); générer automatiquement des messages de validation, etc.

Comme d'autres l'ont souligné dans les commentaires, il est - bien sûr - possible de créer un référentiel local (voir ici et là pour plus de détails).

Si vous préférez héberger votre propre référentiel distant, vous devrez configurer un "dépôt nu". Les deux git init et git clone accepter un --bare arguments.

Sauvegarde Borg

Je peux également recommander la sauvegarde de borg. Il vous offre :

  • Horodatages
  • borg diff (comparer entre les instantanés)
  • Élagage (débarrassez-vous des instantanés plus anciens - disons que vous voulez un instantané pour le mois en cours tous les jours, mais sinon un seul par mois)
  • Chiffrement (facultatif)
  • Compression (facultatif)
  • et bien plus encore...

Ce qui est cool, c'est qu'il est très flexible - il est facile à configurer mais vous offre de nombreuses options si vous le souhaitez.

Une fois, j'ai écrit un guide de démarrage rapide qui pourrait être utile.


Vous pouvez procéder de plusieurs manières :

  • Vim
  • Emacs
  • Git
  • Bash/Outil externe
  • Git-annex (solution tout-en-un)

Qui sont tous détaillés ici :

  • Si vous voulez faire cela dans Vim :

Ensuite, je recommanderais d'utiliser l'historique d'annulation, qui non seulement (comme son nom l'indique) se rapporte à l'acte de undo une action dans l'éditeur Vim, mais aussi celle que vous enregistrez. Plus ici.

Ajouter ce qui suit à votre .vimrc :

let vimDir = '$HOME/.vim'
let &runtimepath.=','.vimDir

" Keep undo history across sessions by storing it in a file
if has('persistent_undo')
    let myUndoDir = expand(vimDir . '/undodir')
" Create dirs
    call system('mkdir ' . vimDir)
    call system('mkdir ' . myUndoDir)
    let &undodir = myUndoDir
    set undofile
endif

Faire en sorte que chaque modification/annulation soit conservée en permanence dans le répertoire undodir sous votre vimDir local , qui est par défaut soit .vim dans votre répertoire personnel, ou d'autres mentionnés dans la sortie de :version ou --version sur la ligne de commande.

Pour encore plus de contrôle sur votre historique d'annulation, je vous recommande également d'utiliser Undotree pour compléter l'expérience.

  • Si vous prévoyez de le faire sur Emacs :

Il existe des packages nommés similaires appelés Undotree, qui font des choses similaires. Plus d'informations sur l'historique d'annulation ici.

  • Si vous préférez un Git solution :

Je recommanderais d'utiliser git-autocommit, qui est un petit script bash, avec git comme seules dépendances, qui surveille le répertoire git actuel (où vous le lancez) pour tout nouveau fichier/ou fichier modifié, et validez-les.

Étant donné la nature de Git il conserve toutes les modifications apportées au fichier, et même s'il ne conviendrait pas à un projet de production/sérieux, c'est une solution utile si cela ne vous dérange pas de ne pas avoir de message de validation/message de validation générique (que vous pouvez toujours modifier/ajouter plus tard).

Lancez-le après avoir navigué sur le répertoire git voulu (qui est d'abord fait avec git init sur un répertoire spécifique, plus d'infos sur le manuel officiel) comme ceci :

screen -dmS namehere git-autocommit -i 1 -V

si vous utilisez screen , pour tmux :

tmux new -n namehere git-autocommit -i 1 -V

sinon :

git-autocommit -i 1 -V

suffira si vous préférez ne pas l'arrière-plan.

  • Si vous préférez un Bash solution :

Je recommanderais d'utiliser inotify-tools ou plus précisément inotifywatch qui peut détecter et (comme son nom l'indique) surveiller un fichier/répertoire pour les modifications, sur lesquelles vous pouvez ensuite agir (comme l'enregistrer ailleurs, etc.).

Voici le drapeau à utiliser avec inotifywatch :

inotifywait -r -m -q -e close_write --format %w%f yourdirectorypathhere

et ici un exemple Bash script utilisant ce qui précède :

#!/bin/bash
inotifywait -r -m -q -e close_write --format %w%f directorytowatch | while IFS= read -r file; do

    process $file
done

process peut être tout ce que vous voulez, comme tar si vous voulez faire une sauvegarde sur modification de fichier, ou avec rclone si vous voulez le télécharger quelque part...

  • Si vous souhaitez une solution tout-en-un :

Je recommanderais git-annex qui englobent non seulement Git mais de nombreux autres outils externes, comme inotify-tools , bash , tar , rclone , borg etc.

Plus d'infos ici.

Si vous avez envie de lire le wiki/forum plus tard, vous pouvez également le cloner localement, pour une lecture hors ligne :

git clone git://git-annex.branchable.com

pour le site, le forum (tout est en démarque, donc c'est très rapide à télécharger...), et la base de code (c'est en Haskell !) etc


Une autre approche, qui couvrira tous les fichiers d'un système de fichiers donné, consiste à utiliser un système de fichiers structuré en journal tel que NILFS.

Ces systèmes de fichiers ajoutent des modifications, ils ne remplacent pas les données. Cela équivaut en fait à un instantané continu (ou plutôt à un point de contrôle) et vous permet de revisiter le système de fichiers à différents moments dans le passé. Les points de contrôle plus anciens sont susceptibles d'être ramassés une fois qu'ils ont atteint un certain âge, mais les points de contrôle peuvent être transformés en instantanés permanents, et il est possible d'automatiser cela, par exemple pour conserver un instantané par heure le mois dernier, puis un par jour. pendant six mois, puis un par semaine etc.

NILFS est bien pris en charge sur Linux et est assez efficace lorsqu'il est utilisé pour /home .


Linux
  1. Alternative à "dd" qui ne tronque pas le fichier ?

  2. Afficher tout le fichier jusqu'au match ?

  3. Est-il possible de trouver quel Vim/tmux a ouvert le fichier ?

  4. Trouver le mot le plus long dans un fichier texte

  5. Comment insérer un texte au début d'un fichier ?

Comment ajouter du texte au début du fichier sous Linux

Comment supprimer tous les espaces blancs d'un fichier texte

Créer des fichiers en utilisant la ligne de commande sous Linux

Chat récursif tous les fichiers en un seul fichier

Pourrait moins montrer la proportion vue du fichier texte?

Comment pixelliser tout le texte d'un PDF ?