Kann die Git-Konfiguration für mehrere Repositorys festgelegt werden?

18

Git scheint Konfigurationswerte auf drei Ebenen zu unterstützen:

  • Globale Einstellungen pro System (gespeichert in /etc/git-core)
  • Globale Benutzereinstellungen (gespeichert in ~/.gitconfig)
  • Lokale Einstellungen pro Repository (gespeichert in $REPO/.git/config)

Diese Optionen decken den größten Teil der Basis ab, aber ich suche nach einer Möglichkeit, mit einer vierten Ebene umzugehen. Ich habe eine (sehr) große Sammlung von Repositorys, für die ich einen anderen Wert user.emailals den üblichen verwenden muss. Diese Repositorys werden häufig über automatisierte Skripts erstellt und bearbeitet. Die Einrichtung lokaler Einstellungen pro Repository ist umständlich.

Alle fraglichen Repositorys befinden sich unter einem bestimmten Pfadpräfix auf meinem lokalen System. Gibt es eine Möglichkeit, irgendwo einen Konfigurationswert festzulegen, der von allen Repositorys unter diesem Pfad geerbt wird? (Ähnliche .htaccessEinstellungen erben das gesamte Dateisystem.) Vielleicht gibt es eine Möglichkeit, bedingte Werte in der globalen Konfigurationsdatei festzulegen? Welche anderen Vorkehrungen könnten in einer UNIX-Umgebung getroffen werden, um mit einer Reihe von Repositorys wie meinem fertig zu werden?

Caleb
quelle
Mein erster Reflex ist, die Skripte zu hacken, um sie .gitconfigin jedem von ihnen erstellten Verzeichnis zu optimieren . Zum Beispiel kann das Repo von IIRC Android dies tun, aber Sie müssen die Quelle sorgfältig lesen, um dies herauszufinden. (Ich bin mir nicht ganz sicher, das habe ich schon eine Weile nicht mehr getan.)
Gilles 'SO - hör auf, böse zu sein',
@ Gilles: Das ist sicherlich eine Möglichkeit. Die fraglichen Repos sind das Paket-Repository für eine Linux-Distribution, die kürzlich von CVS nach Git migriert wurde. Wir arbeiten immer noch daran, unser gesamtes Werkzeug zu überarbeiten. Auf lange Sicht wird dies wahrscheinlich behoben, aber auf kurze Sicht experimentieren diejenigen von uns, die daran arbeiten, mit den Optionen.
Caleb

Antworten:

11

Ich habe keine Möglichkeit gefunden, Git auf dieser vierten Ebene zu konfigurieren. Die einzige Möglichkeit scheint darin zu bestehen, dass der Konfigurationswert pro Befehl überschrieben wird git -c key=value.

Meine derzeitige Hacky-Lösung besteht darin, eine Shell-Funktion zu definieren, die als Wrapper für Git dient. Beim Aufruf werden die Argumente an den Befehl system git übergeben, jedoch nicht bevor das aktuelle Arbeitsverzeichnis überprüft und dem Befehl gegebenenfalls ein zusätzliches Argument hinzugefügt wird.

function git () {
    case "$PWD" in
        /path/to/repos/*)
            command git -c user.email=alternate@credentials.org "$@"
            ;;
        *)
            command git "$@"
            ;;
    esac
}
Caleb
quelle
kann ich command git -c [email protected] user.name="Alter Ego" "$@"oder wie soll ich das machen? Gesucht hoch & niedrig und der einzige Hinweis auf diese -c Flagge, den ich gefunden habe, war Ihre, danke, sehr geschätzt.
Vic Goldfeld
command git -c [email protected] -c user.name="Alter Ego" "$@"
Vic Goldfeld
6

Sie können die E-Mail-Adresse für git mit der Umgebungsvariablen konfigurieren GIT_AUTHOR_EMAIL. Wenn Sie dies mit Bash-Skripten beim Eingeben eines Verzeichnisses oder einer verzeichnisspezifischen Shell-Konfiguration mit zsh kombinieren , können Sie die Einstellungen problemlos pro Verzeichnis oder übergeordnetem Verzeichnis ändern. Wenn Sie z. B. in ein Verzeichnis eingeben ~/work, können Sie die Umgebungsvariablen automatisch anpassen, um Ihre E-Mail zu ändern Adresse.

Ulrich Dangel
quelle
2

Sehen Sie sich die Lösung basierend auf der Git-Konfiguration an:

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

Fügen Sie der Datei "~ / .gitconfig" hinzu:

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

Erstellen Sie die Datei "~ / .gitconfig-project1" mit folgendem Inhalt:

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

    [user]  
      name = user1  
      email = user1@email.com  
gik
quelle
Das Prädikat "includeIf" erspart mir Kopfschmerzen!
Truong Nguyen
1

Basierend auf der Antwort von Caleb können wir einen modifizierten gitBefehl definieren, der alle Repositorys in diesem Verzeichnis dauerhaft korrekt konfiguriert, sodass alle zukünftigen Verwendungen von Vanilla Git die neue Konfiguration verwenden. Ich benutze hub, das ist ein anderer Git-Wrapper, also habe ich meinen alias git=hubdurch diesen ersetzt und hubmeine Funktion aufgerufen. Wenn Sie ihn nicht verwenden hub, ersetzen Sie alle hubAufrufe durch 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
}

Im Gegensatz zu Calebs Antwort, die nur in einer Shell funktioniert (und sofern nicht ausdrücklich anders angegeben, nur in einer interaktiven Shell), betrifft dies auch andere Git-Frontends, die die Git-Konfiguration korrekt lesen, wie z. B. emacs magit.

Robin Green
quelle