ocean - Evitar que se empujen a git que contengan pestañas en ciertos archivos(por ejemplo,*.cpp,*.h, CMakeLists.txt)
github (3)
Basado en benprew''s trabajo benprew''s , aquí hay un gancho anterior a la secuencia de comandos que muestra un error si se han agregado caracteres de tabulación, así como el número de línea correspondiente. Guarde lo siguiente en .git/hooks/pre-commit
.
( Nota: pre-commit
es el nombre del archivo. No debería haber ninguna .
Extensión)
#!/bin/sh
if git rev-parse --verify HEAD 2>/dev/null
then
git diff-index -p -M --cached HEAD
else
:
fi |
perl -e ''
my $found_bad = 0;
my $filename;
my $reported_filename = "";
my $lineno;
sub bad_line {
my ($why, $line) = @_;
if (!$found_bad) {
print STDERR "*/n";
print STDERR "* You have some suspicious patch lines:/n";
print STDERR "*/n";
$found_bad = 1;
}
if ($reported_filename ne $filename) {
print STDERR "* In $filename/n";
$reported_filename = $filename;
}
print STDERR "* $why (line $lineno)/n";
print STDERR "$filename:$lineno:$line/n";
}
while (<>) {
if (m|^diff --git a/(.*) b//1$|) {
$filename = $1;
next;
}
if (/^@@ -/S+ /+(/d+)/) {
$lineno = $1 - 1;
next;
}
if (/^ /) {
$lineno++;
next;
}
if (s/^/+//) {
$lineno++;
chomp;
if (/ /) {
bad_line("TAB character", $_);
}
}
}
exit($found_bad);
''
No es exactamente lo que pediste, ya que no realiza ninguna comprobación de nombre de archivo, pero espero que sea de gran ayuda.
Me gustaría que mi repositorio remoto rechace cualquier inserción que contenga un archivo que contenga una pestaña, pero solo si el archivo pertenece a una determinada clase (según el nombre del archivo). ¿Es eso posible?
He mirado un poco el update hook
en githooks, y creo que es el correcto.
Así que en resumen, un empuje debe ser rechazado si:
- hay un archivo de los tipos enumerados (
*.cpp
,*.h
,CMakeLists.txt
) - que contiene uno o más caracteres de tabulación.
Oh, oh, esta pregunta parece haberse deslizado a través de las grietas. Espero que todavía estés ahí fuera, Esben!
Está buscando un enlace de actualización , que se ejecuta una vez para cada referencia actualizada. Los argumentos son el nombre de la referencia, el nombre de objeto antiguo (commit SHA1) y el nombre de objeto nuevo.
Entonces, todo lo que realmente necesita hacer es verificar la diferencia entre lo antiguo y lo nuevo y asegurarse de que cumpla con sus estándares. Esto no es totalmente sencillo, por supuesto, pero es totalmente manejable. Esto es lo que yo haría:
Guarde el siguiente script en .git/hooks/update
.
old=$2
new=$3
# that''s a literal tab, because (ba)sh turns /t into t, not a tab
# make sure your editor doesn''t expand it to spaces
git diff --name-only $old $new | egrep ''(/.(cpp|h)$)|^CMakeLists.txt$'' | xargs -d''/n'' git diff -U0 $old $new -- | grep -q ''^+.* '' && exit 1
Eso enumera todos los archivos que difieren entre lo antiguo y lo nuevo, greps para todos los deseados, obtiene el diff para ellos (con cero líneas de contexto, ya que no nos importa), y greps para una línea adicional (comenzando con +
) que contiene una pestaña. El grep sale exitosamente si encuentra uno, lo que permitirá que &&
ejecute la exit 1
, lo que provocará que el gancho salga del fallo y aborte la actualización.
Tenga en cuenta que esto es ligeramente diferente de sus requisitos: comprueba si el diff agrega caracteres de tabulación. Esto es probablemente mejor a largo plazo; Una vez que se haya asegurado de que su código existente está bien, es lo mismo, excepto que es mucho más rápido, ya que no tiene que buscar todo el contenido.
Podría configurar un gancho de empuje previo , pero esto no está realmente en el espíritu del mecanismo de publicación de git.
Prefiero ir con
- Un gancho de pre-commit , previniendo cualquier commit con el contenido incorrecto.
- o un controlador de filtro que puede asociar fácilmente con los tipos de archivo correctos, y que puede corregir o reportar cualquier contenido inapropiado.