Me gustaría usar git para registrar todos los cambios en un archivo.
¿Hay alguna manera de activar git 'commit' para que ocurra automáticamente cada vez que se actualiza un archivo, por lo que hay una nueva confirmación para cada cambio en un archivo?
Idealmente, me gustaría que mis usuarios ni siquiera supieran que git se está ejecutando detrás de escena. Un usuario podría potencialmente "deshacer" los cambios en un archivo, y esto podría lograrse sacando una versión anterior de git.
Respuestas:
En Linux, puede usar inotifywait para ejecutar automáticamente un comando cada vez que se cambia el contenido de un archivo.
Editar: el siguiente comando confirma file.txt tan pronto como se guarda:
fuente
-r
bandera parainotifywait
, pero tenga en cuenta que el núcleo tiene un límite en la cantidad de relojes inotifywait que puede configurar.man inotifywait
Te diré más.La respuesta anterior de inotifywait es excelente, pero no es una solución completa. Como está escrito, es una confirmación de una sola vez para un cambio único en un archivo. No funciona para el caso común en el que editar un archivo crea un nuevo inodo con el nombre original. Inotifywait -m aparentemente sigue los archivos por inodo, no por nombre. Además, después de que el archivo ha cambiado, no está preparado para git commit sin git add o git commit -a . Haciendo algunos ajustes, esto es lo que estoy usando en Debian para seguir todos los cambios en mi archivo de calendario:
/etc/rc.local:
/ home / <nombre de usuario> / bin / gitwait:
Esto podría generalizarse para esperar en una lista de archivos y / o directorios, y los procesos de inotifywait correspondientes , y reiniciar cada inotifywait a medida que se cambia un archivo.
fuente
Las respuestas anteriores que recomendaban inotifywait para este trabajo me indicaron la dirección correcta cuando tuve este problema yo mismo, así que escribí un pequeño guión. Primero, esto solo podía ver carpetas enteras de forma recursiva (lo contrario del ejemplo de Lester Buck), pero luego también quería ver un archivo en otro lugar, así que lo expandí.
El resultado es un script llamado actualmente
gitwatch
, ya que eso es lo que hace: observa los cambios en un archivo o carpeta (usando inotifywait) y los confirma en un repositorio git.Puede encontrar el script, más información e instrucciones en github: https://github.com/nevik/gitwatch
fuente
git-wip es una gran solución que me funciona bien. "WIP" significa "trabajo en progreso". Cada vez que ejecuta 'git wip', los cambios se confirman en una rama separada. Se puede ejecutar en la línea de comando, pero hay extensiones para que vim y emacs ejecuten automáticamente git-wip cada vez que se escribe un archivo.
fuente
Quería hacer esto en Windows, y encontré que la mejor manera era usar Directory Monitor para verificar los cambios y luego, cuando detectó un cambio, lo ejecuté:
Programa: cmd.exe
Parámetros: /CC:\pathToBatchFile.bat
Ese archivo por lotes contenía:
También intenté tener otro comando allí para agregar archivos (
"%PROGRAMFILES(X86)%\git\bin\sh.exe" --login -i -c "git add *.*"
), pero no creo que haya funcionado correctamente.También hice un gancho posterior a la confirmación que contiene:
(Si hubiera algún conflicto, entonces abortaría el tirón y el empuje, pero no había ninguna forma clara de saber que había sucedido; al final, abandonamos toda la idea debido a este defecto).
Ese comando curl le dijo a mi servidor que necesitaba hacer una extracción del código. Todo lo que se necesitaba para manejarlo en php era:
El único problema con eso era que tenía que ser ejecutado por el usuario root en lugar del usuario apache, por lo que también tuve que hacer un archivo que
/etc/sudoers.d/
contenga:Para mí, creo que funcionó bastante bien. Directory Monitor se puede configurar para ejecutarse al inicio y comenzar minimizado, y puede ver varias carpetas diferentes
fuente
autocompletado con fecha y hora actuales.
fuente
Inotify realmente suena como la herramienta adecuada para el trabajo.
Hay una herramienta llamada incron que podría ser exactamente lo que estás buscando. Puede especificar archivos o carpetas (y tipos de eventos, como "cambiar", "crear", "desvincular") en algo así como un crontab y un comando que se ejecutará cuando ocurra tal evento.
A diferencia de inotifywait (que sería el análogo del cron del pobre
sleep 10;do stuff
), esto captará todos los eventos, no solo el primero.No lo he usado yo mismo, pero desde la documentación no parece demasiado complejo de configurar.
fuente
Escribí un programa, GitPrime , para proporcionar autoguardado para sus repositorios locales de Git. ¡Ahora es fácil retroceder antes de que lo revientes! Repositorio Bitbucket .
Esto debería funcionar en cualquier plataforma que admita un shell bash, incluido Windows + Cygwin.
fuente
En caso de que alguien intente hacer esto desde Powershell, tuve éxito usando lo siguiente:
fuente
Dos soluciones que me gustan son etckeeper , que se pueden adaptar a un directorio personalizado que no sea
/etc
:Y gitwatch , especialmente las instrucciones de cómo usarlo
supervisord
.fuente
Si conoce el nombre del archivo y desea monitorear solo uno (o algunos archivos), simplemente puede llamar "git commit" cada pocos minutos para lograr esto. Si el archivo no ha cambiado, git solo se quejará y tendrá que ignorar este error, pero aparte de eso, no habrá corrupción.
Además de eso, querrá marcar estos archivos como "confirmación automática" para poder confirmar también manualmente. De esta manera, el usuario puede ver los cambios automáticos y también los cambios "lógicos" más grandes que van acompañados de comentarios de confirmación para explicar que ha cambiado desde la última confirmación manual.
Por ejemplo, use "AUTOCOMMIT" como mensaje de confirmación. Más tarde, puede escribir una herramienta para purgar estas confirmaciones utilizando git log (para averiguar las revisiones a matar) o puede intentar crear una rama AUTOCOMMIT utilizando una estrategia de resolución de colisión de fuerza bruta para martillar en las "confirmaciones manuales".
Otra opción es usar los comandos de bajo nivel git para construir su propio repositorio especializado.
Por último, puede copiar el archivo a un nuevo nombre ("$ filename.ac") mientras realiza confirmaciones automáticas para distinguir entre las versiones manual y automática.
fuente
Estoy bastante seguro de que necesitarás conectarlo al editor que estén usando tus usuarios. Podría escribir algo para sondear los cambios, pero dependiendo de los patrones de uso, la frecuencia de sondeo podría necesitar ser increíblemente alta para asegurarse de que estaba recogiendo cambios individuales en lugar de múltiples cambios.
fuente
Parece que está buscando algo similar a etckeeper , que está diseñado para verificar automáticamente todos sus cambios a / etc / * en git (o cualquier VCS que desee), pero no veo ninguna razón para que no pueda usarse con archivos que no sean los de / etc.
Si solo desea lidiar con un solo archivo, tal vez eso no sería perfecto, pero si desea realizar un seguimiento de todo en un directorio determinado, creo que vale la pena consultarlo.
fuente
Este script no se ejecuta cuando un usuario cambia el archivo, pero podría ejecutarse como un trabajo cron (colocándolo en un directorio /etc/cron.*), que también es una solución razonable.
Este script iterará a través de su directorio / srv / www (cámbielo a donde estén almacenados todos sus sitios), agregue, confirme e inserte todos los archivos, y registre todo en /var/log/gitlog.txt
fuente
Tuve el mismo problema y en mac launchd le brinda una gran solución. Verá un archivo o un directorio y, si hay cambios, puede ejecutar una aplicación o cualquier otra cosa ...
fuente
Hice este pequeño script de shell para monitorear el estado de los archivos y activar comandos como git commit en el éxito de la compilación.
Siéntase libre de descargarlo y probarlo.
https://github.com/nzvincent/nzvincent-github/blob/master/inotify-tools/inotify.sh
fuente
Esto no satisface la parte "Idealmente" de la pregunta, pero esta fue la pregunta más cercana que vi a la respuesta que quería, así que pensé que podría ir aquí. Sin embargo, mi primera publicación de stackoverflow, así que disculpa si me equivoco.
La siguiente secuencia de comandos asegura confirmaciones automáticas en los cambios guardados, pero sí solicitar al usuario cometer entrada. (Me doy cuenta de que mi escenario es un poco diferente al de git-noob).
fuente
Para ventanas
De acuerdo con este artículo sobre confirmación automática , debe crear un
.bat
archivo con contenido:y ejecutar con
Task Scheduler
. Si no sabe cómo hacerlo paso a paso, consulte ese artículo.fuente