2012-03-09 9 views
13

Mi plan es usar git para realizar un seguimiento de los cambios en/etc pero al comprometerlo deseo que la persona que realiza el cambio se especifique como autor agregando el - -opción del autor en la línea de comando.Detener un commit de git por un autor específico utilizando el enlace de precompilación

Así que me gustaría detener las confirmaciones accidentales como root.

Intenté crear este enlace precomprometido pero no está funcionando - git var todavía está devolviendo la raíz incluso si especifico el autor en la línea de confirmación.

AUTHOR=`git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/\1/p'` 
if [ "$AUTHOR" == "root <[email protected]>" ]; 
then 
    echo "Please commit under your own user name instead of \"$AUTHOR\":" 
    echo 'git commit --author="Adrian"' 
    echo "or if your name is not already in logs use full ident" 
    echo 'git commit --author="Adrian Cornish <[email protected]>"' 
    exit 1 
fi 
exit 0 
+1

Es sorprendente que no parece ser una forma de obtener esta información. Puedo confirmar que 'git var GIT_AUTHOR_IDENT' muestra el autor original, no el proporcionado mediante' --author' ... – Borealid

+0

Tangencialmente también https://gist.github.com/tripleee/16767aa4137706fd896c – tripleee

Respuesta

10

La versión actual de Git no hace --author información disponible a través de ganchos Git variables de entorno, los argumentos de línea de comandos, o la entrada estándar. Sin embargo, en lugar de requerir el uso de la línea de comandos --author, puede indicar a los usuarios para establecer las variables de entorno GIT_AUTHOR_NAME y GIT_AUTHOR_EMAIL:

#!/bin/sh 
AUTHORINFO=$(git var GIT_AUTHOR_IDENT) || exit 1 
NAME=$(printf '%s\n' "${AUTHORINFO}" | sed -n 's/^\(.*\) <.*$/\1/p') 
EMAIL=$(printf '%s\n' "${AUTHORINFO}" | sed -n 's/^.* <\(.*\)> .*$/\1/p') 
[ "${NAME}" != root ] && [ "${EMAIL}" != "[email protected]" ] || { 
    cat <<EOF >&2 
Please commit under your own name and email instead of "${NAME} <${EMAIL}>": 
GIT_AUTHOR_NAME="Your Name" GIT_AUTHOR_EMAIL="[email protected]" git commit 
EOF 
    exit 1 
} 

Al igual que el argumento --author, estas variables de entorno controlan el autor de comprometerse. Debido a que estas variables de entorno se encuentran en el entorno de Git, también se encuentran en el entorno del enlace pre-commit. Y debido a que están en el entorno del gancho pre-commit, pasan a git var GIT_AUTHOR_IDENT que los usa como git commit.

Desafortunadamente, establecer estas variables es mucho menos conveniente que usar --author. Sugiero contactar a los desarrolladores de Git y solicitarles que establezcan estas variables de entorno (utilizando el valor pasado a través de --author) antes de iniciar el enlace pre-commit.

+0

Gracias, esto es exactamente lo que yo querido. Probé git var en GIT_AUTHOR_NAME y GIT_AUTHOR_EMAIL y siempre estaba en blanco; esto explica por qué. –

+0

Esto no es correcto por más tiempo, parece funcionar con GIT 2.7.4 (mabye también antes). Poniendo 'echo $ GIT_AUTHOR_NAME' en un gancho' pre-commit' imprime el nombre del autor (ya sea el configurado en git config o el que se pasa por '--autor'). También 'git var GIT_AUTHOR_IDENT' parece funcionar con' --autor'. – lumbric

0

He utilizado lo siguiente, agregando esto a los sistemas .bashrc.

No atrapará a la gente que realmente su para rootear y vivir en ese caparazón, (¡malo!) Pero mantiene mis registros útiles cuando la gente simplemente usa sudo. Yo también estoy tratando de mantener un/etc changelog con git, para poder ver lo que se ha hecho mes a mes.

#I want everyone to check in changes to /etc files, but also want their names even when they use sudo. 
export GIT_COMMITTER_EMAIL=${USER}@ourcompany.co.nz 
export GIT_AUTHOR_EMAIL=${USER}@ourcompany.co.nz 

https://serverfault.com/questions/256754/correct-user-names-when-tracking-etc-in-git-repository-and-committing-as-root

Cuestiones relacionadas