2012-03-09 18 views
13

Il mio piano è di usare git per tenere traccia delle modifiche in/etc, ma quando mi impegno voglio che la persona che fa il cambiamento specifichi se stesso come autore aggiungendo il - -author opzione sulla riga di comando.Arresta un commit git da parte di un autore specifico usando il gancio di pre-commit

Quindi mi piacerebbe interrompere i commit accidentali come root.

Ho provato a creare questo hook di pre-commit ma non funziona - git var sta ancora restituendo root anche se si specifica l'autore su commit line.

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

E 'sorprendente non sembra essere un modo per arrivare a queste informazioni. Posso confermare che 'git var GIT_AUTHOR_IDENT' mostra l'autore originale, non quello fornito tramite' --author' ... – Borealid

+0

Tangenzialmente anche https://gist.github.com/tripleee/16767aa4137706fd896c – tripleee

risposta

10

La versione corrente di Git non rende --author informazioni disponibili per ganci Git tramite variabili di ambiente, argomenti della riga di comando, o stdin. Tuttavia, invece di richiedere l'utilizzo della linea --author comando, è possibile indicare agli utenti di impostare le variabili GIT_AUTHOR_NAME e GIT_AUTHOR_EMAIL ambiente:

#!/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 
} 

Come l'argomento --author, queste variabili di ambiente controllano l'autore di commettere. Poiché queste variabili di ambiente si trovano nell'ambiente di Git, si trovano anche nell'ambiente del gancio pre-commit. E poiché sono nell'ambiente del gancio pre-commit, vengono passati a git var GIT_AUTHOR_IDENT che li utilizza come git commit.

Sfortunatamente, l'impostazione di queste variabili è molto meno conveniente rispetto all'utilizzo di --author. Suggerisco di contattare gli sviluppatori Git e di richiedere che imposti queste variabili di ambiente (utilizzando il valore passato tramite --author) prima di avviare l'hook pre-commit.

+0

Grazie a ciò esattamente come ricercato. Ho provato git var su GIT_AUTHOR_NAME e GIT_AUTHOR_EMAIL ed era sempre vuoto - questo spiega perché. –

+0

Questo non è corretto più a lungo, sembra funzionare con GIT 2.7.4 (mabye anche prima). Mettere 'echo $ GIT_AUTHOR_NAME' in un hook' pre-commit' stampa il nome dell'autore (o quello impostato in git config o quello passato tramite '--author'). Anche 'git var GIT_AUTHOR_IDENT' sembra funzionare con' --author'. – lumbric

0

Ho usato quanto segue, aggiungendo questo al sistema .bashrc.

Non catturerà la gente che in realtà su fa per radicare e vivere in quella shell, (male!) Ma mantiene i miei registri utili quando le persone usano solo sudo. Anche io sto cercando di mantenere un changelog/etc con git - così posso vedere cosa è stato fatto mese per mese.

#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

Problemi correlati