2011-01-06 8 views
10

Escribo un simple gancho git precompromiso que actualiza el año en encabezados de derechos de autor para los archivos que se preparan para la confirmación.¿Cómo puedo usar git para representar solo una línea en un archivo para la confirmación, todo desde un script?

Después de modificar la línea con el copyright, me gustaría que el gancho muestre esa línea para que sea parte de la confirmación. No puede simplemente git add el archivo completo, porque puede haber otros cambios preexistentes allí que no se deben organizar.

No veo ninguna opción en el manual git add que le permita trazar líneas específicas.

Me imagino que podría git stash save --keep-index, aplicar mi cambio, git add el archivo, y luego git stash pop, pero eso parece bastante crudo. Cualquier mejor enfoque?

Respuesta

2

Aquí es otra posible solución:

  1. Antes de ejecutar la secuencia de comandos de derechos de autor-modificación, hacer un git status para obtener una lista de los ficheros que está a punto de cometer. Guarde la lista de archivos. Haz un commit

  2. Luego, guarde el resto de los cambios (no relacionados) y aplique su secuencia de comandos a la lista de archivos guardados anteriormente. Use git commit --amend para cambiar la confirmación anterior.

  3. Finalmente, abre el alijo para restaurar tu índice. Resuelva los conflictos si es necesario.

no sé de una manera de contar git add añadir líneas específicas solamente. ¿Cómo describirías las líneas para agregar? Por numero de linea? Parece que podría ser posible en un conjunto estrecho de circunstancias, y generalmente no es útil.

+0

Ah, enfoque ordenado, aunque personalmente preferiría esperar a comprometerme. – Sandy

1

Puede aplicar un parche a la versión por etapas del archivo en un paso separado, p. Ej.

blobid=$(git show :"$filepath" | copyright-filter | git hash-object -w --stdin) 

if $? -eq 0; then 

    git update-index --cacheinfo 100644 "$blobid" "$filepath" && 
    copyright-filter "$filepath" 

fi 

he descaradamente supone que el script se llama copyright-filter y funciona como un filtro o en su lugar, en función de sus argumentos.

1

Mirando la fuente a git add --interactive parece que la forma en que modifica el índice es con git apply --cached. Asumiendo que su derecho de autor es el primer trozo de cualquier diff, realizar el cambio y uso:

git diff -- file | 
awk 'second && /^@@/ {exit} /^@@/ {second=1} {print}' | 
git apply --cached 

Cuando esta segunda línea (la secuencia de comandos awk agarra solamente el primer trozo diff). También podría construir la salida de diff a mano o usar otras reglas para seleccionar el trozo.

Cuestiones relacionadas