GNU/Linux >> Tutoriales Linux >  >> Linux

Mantenga un historial de todas las modificaciones a un archivo de texto

Dar git una oportunidad

No veo por qué es un problema usar una herramienta poderosa. Simplemente escriba un script bash simple que ejecute git periódicamente (a través de cron o systemd temporizadores); generar automáticamente mensajes de confirmación, etc.

Como otros destacaron en los comentarios, por supuesto, es posible crear un repositorio local (consulte aquí y allá para obtener más detalles).

Si prefiere alojar su propio repositorio remoto, deberá configurar un "Repositorio básico". Ambos git init y git clone acepta un --bare argumento.

Copia de seguridad Borg

También puedo recomendar la copia de seguridad de Borg. Te ofrece:

  • Marcas de tiempo
  • borg diff (comparar entre instantáneas)
  • Recorte (deshágase de las instantáneas más antiguas; digamos que desea una instantánea para el mes actual todos los días, pero de lo contrario solo una por mes)
  • Cifrado (opcional)
  • Compresión (opcional)
  • y mucho más...

Lo bueno es que es muy flexible:es fácil de configurar pero te ofrece muchas opciones si lo deseas.

Una vez escribí una guía de inicio rápido que podría ser de ayuda.


Hay un par de formas en las que podrías hacer esto:

  • Vim
  • Emacs
  • Git
  • Bash/herramienta externa
  • Git-annex (solución todo en uno)

Que se detallan aquí:

  • Si quieres hacer esto en Vim:

Entonces recomendaría usar el historial de deshacer, que no solo (como sugiere su nombre) se relaciona con el acto de undo ing una acción en el editor de Vim, pero también la que guardas también. Más aquí.

Agregar lo siguiente a su .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

Hará que todos los cambios/deshaceres se mantengan permanentemente en el directorio undodir bajo su vimDir local , que por defecto es .vim en su directorio de inicio, u otros mencionados en la salida de :version o --version en la línea de comandos.

Para tener aún más control sobre el historial de deshacer, también recomiendo usar Undotree para complementar la experiencia.

  • Si planea hacer esto en Emacs:

Hay un paquete con nombre similar llamado Undotree, que hace cosas similares. Más información sobre el historial Deshacer aquí.

  • Si prefiere un Git solución:

Recomendaría usar git-autocommit, que es un pequeño script de bash, con git como solo dependencias, que observa el directorio git actual (donde lo inicia) en busca de archivos nuevos o archivos modificados, y los confirma.

Dada la naturaleza de Git mantiene todos los cambios en el archivo, y aunque no sería adecuado para un proyecto de producción/serio, es una solución útil si no le importa no tener un mensaje de confirmación/mensaje de confirmación genérico (que siempre puede editar/agregar más adelante).

Inícielo después de navegar en el directorio git deseado (que primero se crea con git init en un directorio específico, más información en el manual oficial) así:

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

si estás usando screen , para tmux :

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

de lo contrario:

git-autocommit -i 1 -V

será suficiente si prefiere no ponerlo en segundo plano.

  • Si prefiere un Bash solución:

Recomiendo usar inotify-tools o más específicamente inotifywatch que puede detectar y (como sugiere su nombre) observar un archivo/directorio en busca de cambios, que luego puede realizar en él (como guardarlo en otro lugar, etc.).

Aquí la bandera a usar con inotifywatch :

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

y aquí un ejemplo Bash script usando lo anterior:

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

    process $file
done

Donde process puede ser lo que quieras, como tar si desea hacer una copia de seguridad en la modificación del archivo, o con rclone si quieres subirlo a algún lado...

  • Si desea una solución todo en uno:

Recomiendo git-annex que no solo abarcan Git pero muchas otras herramientas externas, como inotify-tools , bash , tar , rclone , borg etc.

Más información aquí.

Si tienes ganas de leer el wiki/foro más adelante, también puedes clonarlo localmente, para leerlo sin conexión:

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

para el sitio web, el foro (todo está en rebajas, por lo que es muy rápido de descargar...) y el código base (¡está en Haskell!), etc.


Otro enfoque, que cubrirá todos los archivos en un sistema de archivos dado, es usar un sistema de archivos con estructura de registro como NILFS.

Dichos sistemas de archivos agregan cambios, no reemplazan datos. Esto es efectivamente equivalente a la creación de instantáneas continuas (o más bien, la creación de puntos de control) y le permite volver a visitar el sistema de archivos en varios puntos del pasado. Es probable que los puntos de control más antiguos se recolecten como basura una vez que alcanzan una cierta edad, pero los puntos de control se pueden convertir en instantáneas permanentes y es posible automatizar eso, por ejemplo, para mantener una instantánea por hora durante el último mes, luego una por día. durante seis meses, luego uno por semana, etc.

NILFS está bien soportado en Linux y es bastante efectivo cuando se usa para /home .


Linux
  1. ¿Cómo insertar texto antes de la primera línea de un archivo?

  2. ¿Guardar toda la salida del terminal en un archivo?

  3. Crear archivos usando la línea de comando en Linux

  4. Gato recursivo todos los archivos en un solo archivo

  5. ¿Podría menos mostrar la proporción vista del archivo de texto?

Cómo agregar texto al comienzo del archivo en Linux

Cómo quitar todos los caracteres de espacio en blanco de un archivo de texto

¿Cómo insertar un texto al principio de un archivo?

Eliminar el repositorio de Git, pero conservar todos los archivos

¿Cómo se comprime un archivo y se conserva el archivo .gz?

¿Cómo mantengo mi historial de bash entre sesiones?