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?


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
}

mogę to zrobić command git -c user.email=alternate@credentials.org 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 user.email=alternate@credentials.org -c user.name="Alter Ego" "$@"
Vic Goldfeld


2

Zobacz rozwiązanie oparte na konfiguracji git:

http://gik.firetrot.com/index.php/2018/05/06/git-configuration-across-multiple-repositories/

Dodaj do pliku „~ / .gitconfig”:

    [includeIf "gitdir:~/work/project1/.git"]  
      path = .gitconfig-project1  

Utwórz plik „~ / .gitconfig-project1 with z zawartością:

    [core]  
      sshCommand = "ssh -i ~/.ssh/project1 -F /dev/null"  

    [user]  
      name = user1  
      email = user1@email.com  

Predykat „includeIf” oszczędza mi bólu głowy!
Truong Nguyen

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.