Czy konfigurację git można ustawić dla wielu repozytoriów?

18

Wydaje się, że Git obsługuje wartości konfiguracji na trzech poziomach:

  • Globalne ustawienia dla systemu (przechowywane w /etc/git-core)
  • Ustawienia globalne dla użytkownika (przechowywane w ~/.gitconfig)
  • Ustawienia lokalne dla repozytorium (przechowywane w $REPO/.git/config)

Te opcje obejmują większość podstaw, ale szukam sposobu na obsługę czwartego poziomu. Mam (bardzo) dużą kolekcję repozytoriów, dla których muszę użyć innej wartości user.emailniż dla mojej zwykłej. Te repozytoria są często tworzone i modyfikowane za pomocą automatycznych skryptów, a konfigurowanie lokalnych ustawień dla repozytorium jest uciążliwe.

Wszystkie przedmiotowe repozytoria znajdują się pod pewnym prefiksem ścieżki w moim systemie lokalnym. Czy istnieje sposób ustawienia gdzieś wartości konfiguracji, która zostanie odziedziczona przez wszystkie repozytoria w ramach tej ścieżki? (Coś w rodzaju .htaccessustawień dziedziczy cały system plików.) Być może istnieje sposób na ustawienie wartości warunkowych w globalnym pliku konfiguracyjnym? Jakie inne ustalenia można wprowadzić w środowisku UNIX, aby poradzić sobie z zestawem repozytoriów takich jak mój?

Caleb
źródło
Moim pierwszym odruchem jest zhakowanie skryptów, aby dostosować je .gitconfigw każdym utworzonym katalogu. Na przykład repozytorium Androida IIRC może to zrobić, ale musisz uważnie przeczytać źródło, aby się dowiedzieć. (Nie jestem do końca pewien, nie robiłem tego od dłuższego czasu.)
Gilles „SO- przestań być zły”
@Gilles: Z pewnością jest to możliwe. Repozytoria, o których mowa, to repozytorium pakietów dla dystrybucji Linuksa, która niedawno migrowała z CVS do Git. Nadal pracujemy nad ponownym wykonaniem wszystkich naszych narzędzi. Na dłuższą metę zapewne tam się to rozwiązuje, ale w krótkim czasie ci z nas, którzy nad tym pracują, eksperymentują z dostępnymi opcjami.
Caleb

Odpowiedzi:

11

Nie znalazłem sposobu na skonfigurowanie git na tym czwartym poziomie. Wydaje się, że jedynym sposobem jest zastąpienie wartości konfiguracyjnej dla jednego polecenia za pomocą git -c key=value.

Moje obecne hacky rozwiązanie polega na zdefiniowaniu funkcji powłoki, która służy jako opakowanie dla git. Po wywołaniu przekazuje argumenty do systemowej komendy git, ale nie przed sprawdzeniem bieżącego katalogu roboczego i dodaniem dodatkowego argumentu do komendy, jeśli dotyczy.

function git () {
    case "$PWD" in
        /path/to/repos/*)
            command git -c user.email=alternate@credentials.org "$@"
            ;;
        *)
            command git "$@"
            ;;
    esac
}
Caleb
źródło
mogę to zrobić command git -c [email protected] user.name="Alter Ego" "$@"lub jak to zrobić? Szukałem wysoko i nisko, a jedyne odniesienie do tej flagi -c, które znalazłem, było twoje, dziękuję bardzo.
Vic Goldfeld
dla przypomnienia, współpracowałem z nimcommand git -c [email protected] -c user.name="Alter Ego" "$@"
Vic Goldfeld
6

Możesz skonfigurować adres e-mail dla git za pomocą zmiennej środowiskowej GIT_AUTHOR_EMAIL. Jeśli połączysz to ze skryptem Wykonuj bash po wejściu do katalogu lub konfiguracji powłoki specyficznej dla katalogu za pomocą zsh , możesz łatwo zmienić ustawienia dla katalogu lub katalogu nadrzędnego, np. Jeśli wejdziesz do katalogu ~/work, możesz automatycznie dostosować zmienne środowiskowe, aby zmienić adres e-mail adres.

Ulrich Dangel
źródło
1

W oparciu o odpowiedź Caleba możemy zdefiniować zmodyfikowane gitpolecenie, które trwale konfiguruje wszystkie repozytoria w tym katalogu poprawnie, tak aby wszystkie przyszłe zastosowania waniliowego gita korzystały z nowej konfiguracji. Używam hub, który jest kolejnym otokiem git, więc zastąpiłem alias git=hubgo tym i wywołałem hubw mojej funkcji - jeśli nie używasz hub, zamień wszystkie hubwywołania na command git:

function git() {
    case "$PWD" in
        /home/robin/git/3RD_PARTY)
            hub "$@"
            # We don't know which repository was cloned / operated on, so let's just reconfigure them all
            for f in *; do
                [[ -d "$f" ]] && hub -C "$f" config user.email $my_private_email
            done
            ;;
        /home/robin/git/3RD_PARTY/*)
            hub "$@"
            hub config user.email $my_private_email
            ;;
        *)
            hub "$@"
            ;;
    esac
}

W przeciwieństwie do odpowiedzi Caleba, która działa tylko w powłoce (i jeśli nie jest to wyraźnie pozyskiwane, tylko w powłoce interaktywnej), wpływa to również na inne interfejsy git, które poprawnie odczytują konfigurację git, takie jak emacs magit.

Robin Green
źródło