tipos - git ver archivos modificados
¿Puede un gancho Git agregar automáticamente archivos a la confirmación? (10)
¿Qué tal si escribes un script post-commit
lugar de eso que genera tus archivos, y luego haz que haga (algo en la línea de) git add my_files; git commit --amend
git add my_files; git commit --amend
Me gustaría agregar un archivo generado automáticamente a la misma confirmación utilizando un gancho anterior o posterior a la confirmación en Git, dependiendo de los archivos que se modificaron en esa confirmación. ¿Cómo voy a hacer esto?
He intentado esto como un gancho de precompromiso, pero no tengo suerte:
#!/bin/sh
files=`git diff --cached --name-status`
re="<files of importance>"
if [[ $files =~ $re ]]
then
echo "Creating files"
exec bundle exec create_my_files
exec git add my_files
exec git commit --amend -C HEAD
fi
Esto los agrega exitosamente al repositorio, pero no los agrega al commit. También he intentado usar las dos últimas líneas ejecutivas en un enlace posterior a la confirmación junto con la inspección previa a la confirmación, pero tampoco está bien.
Es posible hacer lo que quieras usando ganchos de pre-commit. Hacemos algo similar para una implementación de heroku (compilando coffeescript a javascript). La razón por la que su script no está funcionando es porque usó el comando exec
incorrecta.
Exec builtin se utiliza para reemplazar la imagen del proceso de shells actualmente en ejecución con un nuevo comando. Al completar con éxito, el ejecutivo nunca regresa. exec no se puede utilizar dentro de una tubería.
Sólo se está ejecutando su primer comando exec. Después de eso, su script es básicamente terminado.
Prueba algo como esto (como un gancho de pre-confirmación):
#!/bin/sh
files=`git diff --cached --name-status`
re="<files of importance>"
if [[ $files =~ $re ]]
then
echo "Creating files"
bundle exec create_my_files
git add my_files
fi
Podría usar una combinación de un script de confirmación previa y posterior.
En el pre-commit:
- Toca un archivo .commit o algo así. (Asegúrese de agregar esto a .gitignore)
En el post-commit:
si existe .mit existe, sabe que se ha realizado una confirmación pero que aún no se ha ejecutado una confirmación posterior. Entonces, puedes hacer tu generación de código aquí. Adicionalmente, prueba para .commit y si existe:
- agrega los archivos
- commit --ammend -C HEAD --no-Verify (evitar bucles)
- eliminar archivo .commit
Este es aproximadamente el proceso que utilizo para almacenar un archivo .metadata en el repositorio generado desde Metastore.
Si alguien sabe de una mejor manera, soy todo oídos, pero parece funcionar por ahora.
Puede utilizar update-index
:
git update-index --add my_files
Sí, puedes agregar archivos generados automáticamente en la confirmación usando git hooks! Pero requiere un guión complicado.
Aquí puedes encontrar el problema resuelto. Allí, está actualizando la versión del archivo en cada confirmación, agregando un nuevo archivo modificado y modificando la confirmación según lo necesite. Está funcionando completamente: https://github.com/evandrocoan/.versioning
Luego, simplemente reemplace el algoritmo ''Reemplazo de archivo de versión'' en el archivo ''updateVersion.sh'', por su algoritmo. Tal vez necesite cambiar algunas cosas, como eliminar la limitación de la rama, porque allí, la secuencia de comandos solo se ejecuta si está en la rama ''desarrollar''.
Además, solo cambiará el archivo especificado, si está en escena. Si el archivo no está almacenado, no hará nada más que la confirmación normal / habitual. Más precisamente, imprime lo que está haciendo en cada paso.
Te voy a explicar ese truco. Es bastante complicado. En el comando prepare-commit-msg-hook, detecta si el archivo deseado se está almacenando y confirmando. Después de eso, crea un archivo de marca y detiene el comando prepare-commit-msg-hook. Más adelante, en el enlace posterior a la confirmación, comprueba si existe el archivo de marca. En caso afirmativo, modifica los archivos en la confirmación.
Atención, crearía un bucle infinito porque volvería a llamar a prepare-commit-msg-hook (como estamos enmendando). Pero no sucede por el archivo de bandera. Cuando el archivo prepare-commit-commit-msg-hook y encuentra el archivo de marca, "sabe" lo que está sucediendo. Entonces solo se borra el archivo de bandera y no se crea de nuevo. Al hacerlo, impedirá que el enlace posterior a la confirmación modifique de nuevo las confirmaciones, permitiendo que la confirmación finalice para siempre.
Si los archivos se generan automáticamente y se pueden generar en cualquier lugar (implícito en su deseo de compilarlos en el enganche de confirmación previa de Git), no debe ponerlos bajo el control de código fuente en primer lugar. Solo debe controlar los archivos de origen; los archivos generados deben generarse como parte de los scripts de compilación.
La única razón para poner un archivo generado bajo control de origen es cuando requiere recursos únicos / privilegiados para generar (como un programa bajo licencia) o cuando se requiere una cantidad significativa de tiempo para generar.
Adicional
De http://git-scm.com/docs/githooks :
pre-commit Este gancho es invocado por git commit, y puede ser anulado con la opción --no-Verify. No toma ningún parámetro y se invoca antes de obtener el mensaje de registro de confirmación propuesto y realizar una confirmación. Salir con un estado distinto de cero desde este script hace que la confirmación git se cancele.
Cuando está habilitado, el gancho de pre-confirmación predeterminado atrapa la introducción de líneas con espacios en blanco finales y cancela la confirmación cuando se encuentra dicha línea.
Todos los ganchos de confirmación de git se invocan con la variable de entorno GIT_EDITOR =: si el comando no muestra un editor para modificar el mensaje de confirmación.
La intención del enlace de pre-confirmación es ser una verificación de aprobación / falla en el estado del área de trabajo y el contenido de la confirmación, antes de realizar la confirmación. Intentar cambiar el contenido de la confirmación no funcionará.
Mi recomendación sería agregar dos pasos a sus scripts de compilación: (1) un paso que compilará todos los archivos desactualizados que se deben generar (y los agrega al área de trabajo), y (2) un paso que comprobará para asegurarse de que todos los archivos generados estén actualizados y devolverá un código de estado distinto de cero. Tu gancho de precompromiso de Git debería ejecutar el segundo paso. Sus desarrolladores deben estar capacitados para ejecutar el primer paso según sea necesario.
También estaba enfrentando el mismo problema en el gancho de pre-commit. Estaba modificando un archivo y confirmando, pero estaba tomando el archivo anterior no actualizado, así que al agregar el comando git (como se muestra a continuación) en el enlace de confirmación previa, se resolvió.
git add $file
nota: $file
es su archivo para ser agregado.
Gracias,
Tenía la misma necesidad y este enfoque funcionó bastante bien para mí:
#!/bin/sh
files=''git diff --cached --name-only''
re="<files of importance>"
if [[ $files =~ $re ]]
then
echo "Creating files"
create_my_files && git add my_files
fi
donde "create_my_files" debería ser ejecutable, por ejemplo, si es un archivo python, podría ejecutarlo como "python create_my_files && git add my_files"
y es cierto que no necesita un compromiso previo para confirmar nuevamente (eso crearía un bucle desagradable infinito: p)
Ya que git add tampoco me funcionaba en una confirmación previa, seguí la idea de mark de usar un archivo .commit y dividir el proceso en confirmación previa y posterior.
Aquí hay un código que debería ser fácil de entender
En el pre-commit:
- Toca un archivo .commit o algo así. (Asegúrese de agregar esto a .gitignore)
#!/bin/sh
echo
touch .commit
exit
En el post-commit:
si existe .mit existe, sabe que se ha realizado una confirmación pero que aún no se ha ejecutado una confirmación posterior. Entonces, puedes hacer tu generación de código aquí. Adicionalmente, prueba para .commit y si existe:
- agrega los archivos
- commit --amend -C HEAD --no-Verify (evitar bucles)
- eliminar archivo .commit
#!/bin/sh
echo
if [ -a .commit ]
then
rm .commit
git add yourfile
git commit --amend -C HEAD --no-verify
fi
exit
Espero que esto haga que sea más fácil para las personas con pocos conocimientos de bash seguir la idea de Mark.
#!/bin/sh
#
# .git/hooks/pre-commit
#
git add file.xyz
Esto funcionó bien para mí. Será parte del compromiso actual.
git version 1.7.12.4 (Apple Git-37)