tutorial gui espaƱol descargar commands comandos git

gui - Hacer git auto-commit



git repository (15)

Me gustaría usar git para registrar todos los cambios en un archivo.

¿Hay alguna manera en que puedo activar git ''commit'' para que suceda automáticamente cada vez que se actualiza un archivo, por lo que hay un nuevo compromiso para cada cambio en un archivo?

Idealmente me gustaría que mis usuarios ni siquiera sepan que el git se está ejecutando detrás de escena. Un usuario podría entonces "deshacer" cambios en un archivo, y esto podría lograrse sacando una versión anterior de git.



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 el archivo.txt tan pronto como se guarda:

inotifywait -q -m -e CLOSE_WRITE --format="git commit -m ''autocommit on change'' %w" file.txt | sh


En caso de que alguien intente hacer esto de Powershell, tuve éxito usando lo siguiente:

& "C:/Program Files (x86)/Git/bin/sh.exe" -c "cd D:/PATH/TO/REPO && git add --all && git commit -m ''Automatic Commit Message Goes Here'' && git push origin master"


Escribí un programa, GitPrime , para proporcionar autoguardado para tus repositorios locales de Git. ¡Ahora es fácil volver atrás antes de que lo reventaste! Repositorio Bitbucket

Esto debería funcionar en cualquier plataforma que admita un shell bash que incluya Windows + Cygwin.


Este script no se ejecuta cuando un usuario cambia el archivo, pero podría ejecutarse como un trabajo cron (soltándolo en un directorio /etc/cron.*), que también es una solución razonable.

Esta secuencia de comandos se repetirá 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

now=$(date +"%m.%d.%Y_%T") logfile=''/var/log/gitlog.txt'' for dir in /srv/www/*/ do echo -e ''/n'' >> $logfile echo "autocommit $dir $now" >> $logfile echo "--------------------------" >> $logfile cd $dir git add . >> $logfile git commit -am "autocommit $now" >> $logfile git push origin master >> $logfile done


Estoy bastante seguro de que tendrás que conectarlo al editor que estén usando tus usuarios. Podría escribir algo para sondear en busca de cambios, pero dependiendo de los patrones de uso, la frecuencia de sondeo podría ser increíblemente alta para asegurarse de que estaba recibiendo cambios individuales en lugar de cambios múltiples.


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 para ejecutar cuando ocurra tal evento.

En contraste con inotifywait (que sería el análogo del cron sleep 10;do stuff del pobre hombre sleep 10;do stuff ), esto atrapará cada evento, no solo el primero.

No lo he usado yo mismo, pero de la documentación no parece demasiado complejo de configurar.


La respuesta inotifywait anterior es excelente, pero no es una solución completa. Tal 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 donde la edición de un archivo crea un nuevo inode con el nombre original. inotifywait -m aparentemente sigue los archivos por inodo, no por nombre. Además, una vez que el archivo ha cambiado, no se configura para la confirmación de git sin la adición de git o la confirmación de git -a . Hacer algunos ajustes, esto es lo que estoy usando en Debian para rastrear todos los cambios en mi archivo de calendario:

/etc/rc.local:

su -c /home/<username>/bin/gitwait -l <username>

/ inicio / <nombre de usuario> / bin / gitwait:

#!/bin/bash # # gitwait - watch file and git commit all changes as they happen # while true; do inotifywait -qq -e CLOSE_WRITE ~/.calendar/calendar cd ~/.calendar; git commit -a -m ''autocommit on change'' done

Esto podría generalizarse para esperar en una lista de archivos y / o directorios, y los correspondientes procesos inotifywait , y reiniciar cada inotifywait a medida que se cambia un archivo.


Las respuestas anteriores que recomendaban inotifywait para este trabajo me alertaron en la dirección correcta cuando tuve este problema yo mismo, así que escribí un pequeño guión. En primer lugar, esto solo podía mirar carpetas enteras recursivamente (lo contrario al ejemplo de Lester Buck), pero también quería ver un archivo en otro lugar, así que lo expandí.

El resultado es un script actualmente llamado gitwatch , ya que eso es lo que hace: mira un archivo o una carpeta en busca de cambios (usando inotifywait) y los envía a un repositorio de git.

Puede encontrar el script, más información e instrucciones en github: https://github.com/nevik/gitwatch


Parece que estás buscando algo similar a etckeeper , que está diseñado para verificar automáticamente todos tus cambios en / etc / * en git (o el VCS que quieras), pero no veo ninguna razón por la que no pueda usarse con archivos. aparte de aquellos en / etc.

Si solo quieres tratar con un solo archivo, quizás eso no sea perfecto, pero si quieres hacer un seguimiento de todo en un directorio determinado, creo que vale la pena revisarlo.


Quería hacer esto en Windows, y encontré que la mejor manera era usar Directory Monitor para buscar cambios y luego, cuando detectaba un cambio, ejecutaba:

Programa: cmd.exe

Params: /CC:/pathToBatchFile.bat

Ese archivo por lotes contenía:

c: cd c:/gitRepoDirectory/ (if exist "%PROGRAMFILES(X86)%" ( "%PROGRAMFILES(X86)%/git/bin/sh.exe" --login -i -c "git commit -am AutoCommitMessage" ) else ( "%PROGRAMFILES%/git/bin/sh.exe" --login -i -c "git commit -am AutoCommitMessage" ))

También intenté tener otro comando allí para agregar archivos ( "%PROGRAMFILES(X86)%/git/bin/sh.exe" --login -i -c "git add *.*" ), Pero no creo Lo conseguí trabajando correctamente.

También hice un gancho post-commit que contenía:

#!/bin/sh git.exe pull -v --progress "origin" git.exe push --progress "origin" master:master curl.exe -s https://webserverdomain.com/updateFromGitHook.x?r=repoName

(Si hubiera algún conflicto, abortaría la extracción y abortaría el empuje, pero no había una forma clara de decir que había sucedido, al final abandonamos la idea debido a este único defecto).

Ese comando curl le dijo a mi servidor que necesitaba extraer el código. Todo lo que se necesitaba para manejarlo en php era:

<? $r = $_GET[''r'']; if (!empty($c)) { //use system instead of exec if you want the output to go back to the git client exec("cd /path/to/repo/parent/$r; sudo git reset --hard HEAD; sudo git pull;"); echo "/n/nServer: Updated/n/n"; } else { echo "/n/nServer: UPDATE FAILED/n/n"; } ?>

El único problema con eso era que el usuario raíz debía ejecutarlo en lugar del usuario apache, por lo que también tuve que crear un archivo en /etc/sudoers.d/ contenga:

www-data ALL = NOPASSWD: /usr/bin/git

Para mí, creo que funcionó bastante bien. Directory Monitor puede configurarse para ejecutarse al inicio y comenzar a minimizar, y puede ver varias carpetas diferentes


Si conoce el nombre del archivo y desea monitorear solo uno (o algunos archivos), simplemente puede llamar a "git commit" cada pocos minutos para lograrlo. Si el archivo no ha cambiado, git solo se quejará y tendrás que ignorar este error, pero aparte de eso, no habrá corrupción.

Además de eso, querrás marcar estos archivos como "autocompromiso" para poder comprometer también manualmente. De esta forma, el usuario puede ver los cambios automáticos y también los cambios "lógicos" más grandes que están acompañados por comentarios de compromiso para explicar que ha cambiado desde la última confirmación manual.

Por ejemplo, use "AUTOCOMMIT" como el mensaje de confirmación. Más tarde, puede escribir una herramienta para purgar estos commits usando git log (para averiguar las revisiones para matar) o puede intentar crear una rama AUTOCOMMIT usando una estrategia de resolución de colisión de fuerza bruta para establecer los "commits manuales".

Otra opción es usar los comandos de bajo nivel de 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.


Tuve el mismo problema y en mac launchd te brinda una excelente solución. Verá un archivo o un directorio y, si hay cambios, puede ejecutar una aplicación o cualquier otra cosa ...


git-wip es una gran solución que funciona bien para mí. "WIP" significa "trabajo en progreso". Cada vez que ejecutas ''git wip'', los cambios se envían a una rama separada. Se puede ejecutar en la línea de comandos, pero hay extensiones para que vim y emacs ejecuten automáticamente git-wip cada vez que se escribe un archivo.


#!/bin/bash git commit -a -m "autoupdate `date +%F-%T`" git push

autopushing con fecha y hora actual.