GNU/Linux >> Linux Esercitazione >  >> Linux

Conserva una cronologia di tutte le modifiche apportate a un file di testo

Dai git una possibilità

Non vedo perché sia ​​un problema utilizzare uno strumento potente. Basta scrivere un semplice script bash che esegua git periodicamente (tramite cron o systemd timer); generare automaticamente messaggi di commit ecc.

Come altri hanno evidenziato nei commenti è - ovviamente - possibile creare un repository locale (vedi qui e là per maggiori dettagli).

Se preferisci ospitare il tuo repository remoto, dovrai configurare un "Bare Repository". Entrambi git init e git clone accettare un --bare argomento.

Backup Borg

Posso anche raccomandare il backup di borg. Ti offre:

  • Timestamp
  • borg diff (confronto tra istantanee)
  • Eliminazione (elimina le istantanee più vecchie:supponi di volere un'istantanea per il mese corrente ogni giorno, ma altrimenti solo una al mese)
  • Crittografia (opzionale)
  • Compressione (opzionale)
  • e molto altro...

La cosa interessante è che è molto flessibile:è facile da configurare ma ti offre molte opzioni se lo desideri.

Una volta ho scritto una guida rapida che potrebbe essere di aiuto.


Ci sono un paio di modi per farlo:

  • Vim
  • Emacs
  • Git
  • Bash/Strumento esterno
  • Git-annex (soluzione all-in-one)

Che sono tutti dettagliati qui:

  • Se vuoi farlo in Vim:

Quindi consiglierei di utilizzare la cronologia degli annullamenti, che non solo (come suggerisce il nome) si riferisce all'atto di undo ing un'azione nell'editor Vim, ma anche quella che salvi. Altro qui.

Aggiungendo quanto segue al tuo .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

Farà in modo che ogni modifica/annullamento venga permanentemente conservata nella directory undodir sotto il vimDir locale , che per impostazione predefinita è .vim nella tua home directory, o in altre menzionate nell'output di :version o --version sulla riga di comando.

Per un controllo ancora maggiore sulla cronologia degli annullamenti, ti consiglio di utilizzare anche Undotree per completare l'esperienza.

  • Se pensi di farlo su Emacs:

Esiste un pacchetto con nome simile chiamato Undotree, che fa cose simili. Maggiori informazioni sulla cronologia degli annullamenti qui.

  • Se preferisci un Git soluzione:

Consiglierei di usare git-autocommit, che è un piccolo script bash, con git in quanto sono solo dipendenze, che controllano la directory git corrente (dove lo avvii) per eventuali nuovi file/o file modificati, e li commit.

Data la natura di Git mantiene tutte le modifiche al file e, anche se non sarebbe adatto a un progetto di produzione/serio, è una soluzione utile se non ti dispiace non avere un messaggio di commit/messaggio di commit generico (che puoi sempre modificare/aggiungere in seguito).

Avvialo dopo aver navigato nella directory git desiderata (che viene prima creata con git init su una directory specifica, maggiori informazioni sul manuale ufficiale) in questo modo:

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

se stai usando screen , per tmux :

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

altrimenti:

git-autocommit -i 1 -V

sarà sufficiente se preferisci non metterlo in secondo piano.

  • Se preferisci un Bash soluzione:

Consiglierei di usare inotify-tools o più specificamente inotifywatch che può rilevare e (come suggerisce il nome) guardare un file/directory per le modifiche, che puoi quindi eseguire azioni su di esso (come salvarlo da qualche altra parte, ecc.).

Qui il flag da usare con inotifywatch :

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

e qui un esempio Bash script utilizzando quanto sopra:

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

    process $file
done

Dove process può essere qualsiasi cosa tu voglia, come tar se vuoi fare il backup alla modifica del file, oppure con rclone se vuoi caricarlo da qualche parte...

  • Se desideri una soluzione all-in-one:

Consiglierei git-annex che non comprendono solo Git ma molti altri strumenti esterni, come inotify-tools , bash , tar , rclone , borg ecc.

Maggiori informazioni qui.

Se hai voglia di leggere il wiki/forum in un secondo momento, puoi anche clonarlo localmente con git, per la lettura offline:

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

per il sito web, forum (è tutto in markdown, quindi è molto veloce da scaricare...), e codebase (è in Haskell!) ecc.


Un altro approccio, che coprirà tutti i file in un dato file system, consiste nell'utilizzare un file system strutturato in log come NILFS.

Tali file system aggiungono modifiche, non sostituiscono i dati. Questo è effettivamente equivalente allo snapshot continuo (o meglio, al checkpoint) e consente di rivisitare il file system in vari punti del passato. I checkpoint più vecchi sono soggetti a raccolta dei rifiuti una volta raggiunta una certa età, ma i checkpoint possono essere trasformati in istantanee permanenti ed è possibile automatizzarlo, ad esempio per conservare un'istantanea all'ora per l'ultimo mese, quindi una al giorno per sei mesi, poi uno a settimana ecc.

NILFS è ben supportato su Linux ed è abbastanza efficace se usato per /home .


Linux
  1. È tutto nel file punto - YADM e Homeshick

  2. Come inserire del testo prima della prima riga di un file?

  3. Mostra tutto il file fino alla partita?

  4. Anteporre il testo a tutti i file in una cartella?

  5. Salva tutto l'output del terminale in un file?

Uso avanzato del visualizzatore di file con meno testo in Linux

Come aggiungere testo all'inizio del file in Linux

Come rimuovere tutti i caratteri di spazio bianco da un file di testo

Alternativa a "dd" che non tronca il file?

È possibile trovare quale Vim/tmux ha il file aperto?

Trovare la parola più lunga in un file di testo