oneline - git tag
¿Puedes cambiar el contenido de un archivo durante git commit? (2)
Una de las cosas que guardo en mi novela abierta en GitHub es una lista de palabras que me gustaría establecer automáticamente en la primera línea, que es el número de palabras en el diccionario. Mi primera opción es escribir un enlace de confirmación previa que lea el archivo, cuente las palabras, vuelva a escribir la primera línea y vuelva a escribirla. Aquí está el código
PRE_COMMIT {
my ($git) = @_;
my $branch = $git->command(qw/rev-parse --abbrev-ref HEAD/);
say "Pre-commit hook in $branch";
if ( $branch =~ /master/ ) {
my $changed = $git->command(qw/show --name-status/);
my @changed_files = ($changed =~ //s/w/s+(/S+)/g);
if ( $words ~~ @changed_files ) {
my @words_content = read_file( $words );
say "I have $#words_content words";
$words_content[0] = "$#words_content/n";
write_file( $words, @words_content );
}
}
};
Sin embargo, como el archivo ya se ha preparado, recibo este error.
error: Sus cambios locales en los siguientes archivos se sobrescribirían al finalizar la compra: text / words.dic Por favor, confirme los cambios o guárdelos antes de poder cambiar de sucursal. Abortando
¿Podría ser mejor hacerlo como un enlace post-commit y haberlo cambiado para el próximo commit? ¿O hacer algo completamente diferente? La pregunta general es: si desea procesar y cambiar el contenido de un archivo durante la confirmación, ¿cuál es la forma correcta de hacerlo?
El compromiso real bloqueado por git commit
es lo que está en el índice una vez que finaliza el enganche de pre-commit. Esto significa que puede cambiar los archivos en el enlace de precompromiso, siempre que git add
también.
Aquí está mi ejemplo de gancho de pre-confirmación, modificado desde el .sample:
#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# [snipped much of what used to be in it, added this --
# make sure you take out the exec of git diff-index!]
num=$(cat zorg)
num=$(expr 0$num + 1)
echo $num > zorg
git add zorg
echo "updated zorg to $num"
exit 0
y entonces:
$ git commit -m dink
updated zorg to 3
[master 76eeefc] dink
1 file changed, 1 insertion(+), 1 deletion(-)
Pero tenga en cuenta un defecto menor (no se aplicará a su caso):
$ git commit
git commit
updated zorg to 4
# On branch master
# Untracked files:
[snip]
nothing added to commit but untracked files present (use "git add" to track)
$ git commit
updated zorg to 5
# Please enter the commit message for your changes. Lines starting
[snip - I quit editor without changing anything]
Aborting commit due to empty commit message.
$ git commit
updated zorg to 6
# Please enter the commit message for your changes. Lines starting
Básicamente, debido a las actualizaciones de enganche de confirmación previa y git add
s, el archivo sigue git add
aunque no esté haciendo la confirmación, aquí.
Resulta que puede ejecutar "ganchos", que en realidad son manejados por otro mecanismo, cuando se almacenan los archivos (a la hora de git add
):
https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes#_keyword_expansion
(desplácese un poco hacia abajo hasta el diagrama "manchar / limpiar")
Esto es lo que entendí:
edite los
.gitattributes
y cree reglas para los archivos que deberían activar una actualización del diccionario:novel.txt updateDict
Luego, dile a Git qué hace el filtro "updateDict" en el borrón (git checkout) y limpia (git add):
$ git config --global filter.updateDict.clean countWords.script
$ git config --global filter.updateDict.smudge cat