Estoy buscando una implementación (en Linux) de un mecanismo que versione de forma automática y transparente cualquier cambio en un directorio (recursivamente). Esto pretende ser una adición (posiblemente un reemplazo si todas las características solicitadas están disponibles) a las versiones estándar (SVN, git, ...)
Un producto en MS Windows que hace esto es AutoVer (para tener una mejor idea de los requisitos). Me encantaría tener algo así pero dirigido a Linux en un entorno no gráfico.
Vi que hay algunos intentos de tener esta funcionalidad en Linux, la más cercana que encontré es la autoversión en Subversion, pero no es obvio implementarla en entornos existentes (servidores donde, por ejemplo, los archivos de configuración son locales).
Tal vez algo trabajando con inotify
?
Gracias de antemano por cualquier puntero! WoJ
Respuestas:
1. Método de uso general usando bazar e inotify
Esto no he sido probado por mí, pero encontré esta escritura que hace uso de
bzr
(bazar) yinotifywait
para monitorear un directorio y controlar la versión de los archivos en él usando bazar.Este script hace todo el trabajo de observar el directorio en busca de cambios:
2. Gestión / etc.
Para el caso especial de administrar el directorio de su sistema
/etc
, puede usar la aplicación etckeeper .Aquí hay un buen tutorial para comenzar a usarlo.
3. Usando git e incron
Esta técnica hace uso de
git
yincron
. Para este método, debe hacer lo siguiente:A. Hacer un repositorio
B. Crear un
$HOME/bin/git-autocommit
guiónC. Agregar una entrada a incrontab
4. Usando Flashbake
Otra opción es usar una herramienta como Flashbake . Flashbake es el sistema de control de versiones que Cory Doctorow (de la fama de BoingBoing) usa para escribir sus libros.
Flashbake usa git debajo del capó para rastrear los cambios, pero está en algún lugar entre hacer copias de seguridad automáticas y usar un sistema de control de versiones simple.
Recursos
fuente
Inmediatamente me viene a la mente ZFS . Puede crear instantáneas, y hay algunos proyectos para crear instantáneas automáticamente .
fuente
Creo que estás en el camino correcto
inotify
. Este artículo detalla su uso básico en un caso similar al suyo. Sugeriría usarlo directamente o compilar una utilidad de nivel de núcleo como fschange . Esto es una molestia, pero puede vincular la detección de cambios a unogit commit
o similar.Ambas soluciones tienen el problema de confiar en soluciones de terceros algo imperfectas. Si no le importa ensuciarse las manos, NodeJS proporciona una excelente instalación multiplataforma ( fs.watch ) para este propósito exacto. Un tutorial básico en la observación de los cambios en los archivos de NodeJS se puede encontrar aquí . En unas pocas docenas de líneas o menos, podría escribir algo que observe un directorio de archivos, y luego se despliegue (a través de child_process ) y ejecute un
git commit
o similar (o incluso incremente manualmente un índice de archivo de versión, si le gusta el roll-your- enfoque propio).fs.watch
está respaldado porinotify
Linux, pero es mucho más intuitivo de usar. Hay otros proyectos de NodeJS que envuelven esa funcionalidad de observación de archivos en varios niveles de conveniencia, como este o este .fuente
inotify
. Pero gracias.inotify (2) en Linux no podrá ver un árbol grande, pero el sistema de archivos fusible (montado en una ubicación separada) probablemente podría manejarlo, traduciendo las solicitudes del sistema de archivos a llamadas svn o git, o cambiando los metadatos svn / git directamente.
Esta es una idea muy interesante, pero no había oído hablar de ninguna implementación existente.
fuente
Tal guión no es difícil de escribir.
Mi control de versiones favorito es git.
El siguiente script debería hacerlo:
o haga que verifique periódicamente su directorio, o si su editor es programable, llame después de guardar.
Pero si lo hace así, podría tener sentido excluir archivos grandes y tal vez algunos "inútiles" como los autoguardados.
fuente
SparkleShare ( http://sparkleshare.org ) se basa en git e implementa una funcionalidad similar a Dropbox con control de versiones, pero debe configurar un servidor ssh (puede ser localhost).
fuente
Te recomiendo que pruebes NILFS. Consulte la página acerca de y podrá decidir rápidamente si es esto lo que está buscando o no.
HTH
fuente
También hay una forma de "pobre" de hacer esto usando solo rsync y un trabajo cron. Básicamente confía en la función de copia de seguridad de rsync y utiliza dos rutas separadas más un prefijo / sufijo para realizar un seguimiento de sus archivos.
Parece más o menos así: / usr / bin / rsync -a -A -X --backup --suffix =
date +".%Y-%m-%d_%H-%M-%S"
$ source_path $ backup_pathResultado final: al cambiar un archivo llamado test_rsync en la ruta de origen después de la ejecución inicial, se creará un archivo llamado test_rsync.2017-02-09_11-00-01 en la ruta de respaldo.
Hay un montón de problemas con esto (funciona si solo tiene una cantidad decente de archivos y fallará por los cambios que ocurran entre dos ejecuciones consecutivas de rsync (1 minuto en mi caso)) pero puede ser suficiente para sus necesidades.
Si estamos hablando aquí sobre las acciones de samba, una lista de exclusión podría estar en orden, no he llegado a eso todavía, me temo.
Avísame si mejoras esto.
fuente
Aquí hay una secuencia de comandos de Python3 que hace VMS como el versionado automático de archivos usando una marca de tiempo añadida al nombre del archivo original cuando se guarda.
Puse un montón de comentarios en el script y ejecuté media docena de dichos scripts en mi máquina ubuntu con solo los directorios diferentes en cada versión diferente del script para que esté versionando simultáneamente varios directorios. No hay pena real para el rendimiento de las máquinas.
! / usr / bin / env python3
print ("VERSIÓN DE ARCHIVOS DE PROYECTO INICIADA") print ("version_creation.py") # coloca todo este código en el script de este nombre print ("ejecuta como ... 'python3 version_creation.py' desde la línea de comandos") print ("ctrl ' c 'para detener ") print (" ") print (" Para ejecutar el programa en segundo plano, escriba debajo de la línea de comando y luego cierre la ventana. ") print (" nohup python3 version_creation.py ") print (" .... to detenga el proceso vaya al menú / administración / monitor del sistema ... y elimine python3 ") print (" ") print (" Siempre guarde los archivos en el directorio 'ProjectFiles' y los archivos de versión ") print (" también se crearán en ese directorio . ") print (" ") print (" ") print (" ") print (" ")
import shutil import os tiempo de importación
--- establece el intervalo de tiempo para buscar nuevos archivos (en segundos) a continuación
- ¡este intervalo debe ser menor que el intervalo que aparecen los archivos nuevos!
t = 10
--- establece el directorio de origen (dr1) y el directorio de destino (dr2)
dr1 = "/ ruta / a / directorio_origen"
dr2 = "/ ruta / a / target_directory"
import glob import os
dr1 = "/ home / michael / ProjectFiles" # ambos originales y versiones se guardarán en este directorio
dr2 = "/ home / michael / ProjectFileVersions"
mientras cierto:
print ("Vacío")
print ("1 Latest_file_path =", latest_file_path)
print ("2 originalname =", originalname)
print ("filecreation =", filecreation)
print ("fivesec_ago =", fivesec_ago)
print ("timedif =", timedif)
compartir
el siguiente se colocó antes y funciona, pero me gusta el script de python anterior mucho mejor ... (he estado usando python durante aproximadamente 3 horas)
fuente