2012-03-09 14 views
13

Moim planem jest użycie git do śledzenia zmian w/etc, ale podczas dokonywania commitów chcę, aby osoba dokonująca zmiany określiła siebie jako autora, dodając - -author opcja w linii poleceń.Zatrzymaj zatwierdzenie git przez określonego autora za pomocą haka pre-commit.

Więc chciałbym zatrzymać przypadkowe commits jako root.

Próbowałem utworzyć hak przed zatwierdzeniem, ale nie działa - git var nadal zwraca root, nawet jeśli podaję autora w linii commit.

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

To zaskakujące, nie wydaje się być sposobem na uzyskanie w tym informacji. Mogę potwierdzić, że 'git var GIT_AUTHOR_IDENT' pokazuje oryginalnego autora, a nie ten podany przez' --author' ... – Borealid

+0

Stycznie również https://gist.github.com/tripleee/16767aa4137706fd896c – tripleee

Odpowiedz

10

Aktualna wersja Git nie czyni --author informacje dostępne haki Git poprzez zmienne środowiskowe, argumenty wiersza polecenia lub standardowego wejścia. Jednak zamiast konieczności korzystania z linii poleceń --author, można polecić użytkownikom ustawić GIT_AUTHOR_NAME i GIT_AUTHOR_EMAIL zmienne środowiskowe:

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

Podobnie jak --author argumentu, te zmienne środowiskowe kontrolować autor popełniania tych. Ponieważ te zmienne środowiskowe znajdują się w środowisku Git, są również w środowisku haka pre-commit. A ponieważ są one w środowisku haka pre-commit, są przekazywane do git var GIT_AUTHOR_IDENT, które używa ich tak, jak robi to git commit.

Niestety, ustawienie tych zmiennych jest znacznie mniej wygodne niż użycie --author. Sugeruję skontaktowanie się z programistami Git i żądanie, aby ustawili te zmienne środowiskowe (używając wartości przekazanej przez --author) przed uruchomieniem haka pre-commit.

+0

Dzięki temu robi się dokładnie tak samo jak ja chciał. Próbowałem git var na GIT_AUTHOR_NAME i GIT_AUTHOR_EMAIL i zawsze było puste - to wyjaśnia dlaczego. –

+0

To nie jest poprawny anylonger, wydaje się działać z GIT 2.7.4 (mabye również wcześniej). Umieszczenie 'echo $ GIT_AUTHOR_NAME' w haseł' pre-commit' wypisuje nazwę autora (albo ten ustawiony w git config, albo ten, który przeszedł przez '--author'). Również 'git var GIT_AUTHOR_IDENT' wydaje się działać z' --author'. – lumbric

0

Użyłem następujących rzeczy, dodając to do systemów .bashrc.

Nie złapie ludzi, którzy faktycznie mają korzeń i żyją w tym skorupie, (złe!) Ale to sprawia, że ​​moje dzienniki są przydatne, gdy ludzie używają właśnie sudo. Ja też próbuję zachować/etc changelog z git - więc mogę zobaczyć, co zostało zrobione miesiąc po miesiącu.

#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