Kann die Git-Konfiguration über mehrere Repositories hinweg festgelegt werden?

Kann die Git-Konfiguration über mehrere Repositories hinweg festgelegt werden?

Git scheint Konfigurationseinstellungen auf drei Ebenen zu unterstützen:

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

Diese Optionen decken den größten Teil der Grundlagen ab, aber ich suche nach einer Möglichkeit, eine vierte Ebene zu handhaben. Ich habe eine (sehr) große Sammlung von Repositories, für die ich einen anderen Wert als user.emailden üblichen verwenden muss. Diese Repositories werden häufig über automatisierte Skripte erstellt und bearbeitet, und das Einrichten lokaler Einstellungen pro Repository ist mühsam.

Alle betreffenden Repositories befinden sich unter einem bestimmten Pfadpräfix auf meinem lokalen System. Gibt es eine Möglichkeit, irgendwo einen Konfigurationswert festzulegen, der von allen Repositories unter diesem Pfad übernommen wird? (So ähnlich wie .htaccessEinstellungen, die sich bis ganz nach oben im Dateisystem vererben.) Vielleicht gäbe 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 Repositories wie meinen zurechtzukommen?

Antwort1

Ich habe keine Möglichkeit gefunden, Git auf dieser vierten Ebene zu konfigurieren. Die einzige Möglichkeit scheint das Überschreiben von Konfigurationswerten pro Befehl mithilfe von zu sein git -c key=value.

Meine aktuelle Hack-Lösung besteht darin, eine Shell-Funktion zu definieren, die als Wrapper für Git dient. Wenn sie aufgerufen wird, übergibt sie die Argumente an den System-Git-Befehl, aber nicht, bevor sie das aktuelle Arbeitsverzeichnis überprüft und dem Befehl gegebenenfalls ein zusätzliches Argument hinzufügt.

function git () {
    case "$PWD" in
        /path/to/repos/*)
            command git -c [email protected] "$@"
            ;;
        *)
            command git "$@"
            ;;
    esac
}

Antwort2

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

https://dzone.com/articles/how-to-use-gitconfigs-includeif

Zur Datei „~/.gitconfig“ hinzufügen:

    [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 = [email protected]  

Antwort3

Sie können die E-Mail-Adresse für Git mit der Umgebungsvariable konfigurieren GIT_AUTHOR_EMAIL. Wenn Sie dies mit kombinierenFühren Sie Bash-Skripte beim Aufrufen eines Verzeichnisses ausoderverzeichnisspezifische Shell-Konfiguration mit zshSie können die Einstellungen problemlos pro Verzeichnis oder übergeordnetem Verzeichnis ändern. Wenn Sie beispielsweise ein Verzeichnis betreten, ~/workkönnen Sie die Umgebungsvariablen automatisch anpassen, um Ihre E-Mail-Adresse zu ändern.

Antwort4

Basierend auf Calebs Antwort können wir einen geänderten gitBefehl definieren, der alle Repositories in diesem Verzeichnis dauerhaft richtig konfiguriert, sodass bei allen zukünftigen Verwendungen von Vanilla Git die neue Konfiguration verwendet wird. Ich verwende hub, einen weiteren Git-Wrapper, also habe ich mein alias git=hubdurch dies ersetzt und hubmeine Funktion aufgerufen – wenn Sie 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 explizit mit einer Quelle versehen, nur in einer interaktiven Shell), betrifft dies auch andere Git-Frontends, die die Git-Konfiguration korrekt lesen, wie etwa Emacs Magit.

verwandte Informationen