tipos tag practices example etiquetas delete create best git githooks

tag - Cómo agregar un archivo al índice en un gancho de confirmación previa de git



git tags best practices (4)

He buscado duplicados y, si bien algunos de ellos tienen títulos similares, no he encontrado a nadie que tenga el mismo problema que yo, así que aquí va.

He escrito un script que se ejecuta en pre-commit y usa la salida de git status --porcelain para compilar cualquier archivo LESS en mi proyecto que haya cambiado. Esta parte funciona bien. Pero quiero que los archivos .css se incluyan en la confirmación actual. Entonces, además de ejecutar el compilador, mi script ejecuta git add <filename> . Y aquí es donde las cosas se ponen difíciles.

El archivo se agrega al índice, pero no es el índice de la confirmación actual. Entonces, si style.less , y ejecuto git commit -a (o git add style.less manualmente git add style.less ), el compilador debe generar style.css y style.min.css y agregarlos al commit actual. Pero el comportamiento que he notado es solo style.less está confirmado, a pesar de los dos archivos .css que se agregan al índice para la próxima confirmación.

Entonces, mi pregunta es: ¿hay una manera de agregar archivos a un compromiso en un gancho de confirmación previa para que tengan efecto para ese compromiso? Tenga en cuenta que antes de que se ejecute el enganche de confirmación previa, esos dos archivos .css no se modifican, por lo que no puedo agregarlos antes de eso. También sé que puedo salir del gancho con un estado distinto de cero, por lo que la confirmación se cancela pero los archivos se agregan, pero espero evitarlo. ¿Alguna idea mejor?


¿Por qué quieres hacer esto en primer lugar? Usted está tratando de incluir los archivos generados en el control de versiones, lo que en general no es una buena idea. Si necesita que style.min.css esté allí en el proceso de pago, ¿por qué no puede generarlo después del proceso de pago en un paso de compilación?


No puedo reproducir tu problema. Mi suposición inicial fue que la variable de entorno GIT_INDEX_FILE estaba siendo desactivada por su gancho de pre-commit . Sin embargo, cuando intenté desactivar GIT_INDEX_FILE de pre-commit , tuve un problema diferente (Git se quejó de que .git/index estaba bloqueado).

Aquí hay un script de ejemplo que muestra que Git funciona como usted espera y que otra cosa debe estar mal. Esta secuencia de comandos inicializa un nuevo repositorio de prueba, crea un enganche de pre-commit que emula lo que hace tu enganche y realiza algunas pruebas de verificación:

#!/bin/sh # initialize the test repository rm -rf testrepo git init testrepo cd testrepo # create the pre-commit hook cat <</EOF >.git/hooks/pre-commit #!/bin/sh git status --porcelain | while IFS= read -r line; do # todo: handle renames and deletions of a *.less file f=${line#???} case ${f} in *.less) fb=${f%.less} echo bar >>"${fb}".css echo baz >>"${fb}".min.css git add "${fb}".css "${fb}".min.css ;; esac done EOF chmod +x .git/hooks/pre-commit # create foo.less, commit it echo foo >foo.less git add foo.less git commit -m "add foo.less" # modify foo.less, commit it echo foo2 >>foo.less git commit -a -m "modify foo.less"

Si ejecuta git log -p en el repositorio de prueba y observa las confirmaciones resultantes, verá que foo.css y foo.min.css se modificaron cada vez que foo.less se modificó.

He aquí por qué pensé que su problema se debió al cambiar / desarmar la variable de entorno GIT_INDEX_FILE :

Cuando se ejecuta git commit -a , Git crea un archivo de índice temporal y lo utiliza en lugar del .git/index predeterminado para crear el commit. Para que las operaciones como git add funcionen desde un GIT_INDEX_FILE pre-commit , Git establece la variable de entorno GIT_INDEX_FILE en el nombre del índice temporal que creó antes de ejecutar pre-commit . Si su enganche GIT_INDEX_FILE , o lo establece en .git/index , entonces todas las operaciones Git dentro de su enganche intentarán modificar el índice original, no el índice temporal que se usa para generar la confirmación.

Sin embargo, el archivo de índice temporal también actúa como un bloqueo en el archivo de índice original. Si un gancho intenta modificar el índice original y el índice temporal existe, Git abortará con un error.


Puede aprovechar la modificación de la última confirmación. Solo una idea.


Se me ocurre que podría tener el atributo git ''limpio'' para ser un script que actualice los archivos generados. Normalmente ese gancho puede ejecutar un script para ordenar su código fuente, pero creo que podría usarse para "limpiar" su salida generada. Este atributo se activa cuando haces ''git add'' y puedes hacer que el script haga otro ''git add'' en el archivo generado.