Unterschiedliche Git Benutzer – einfach eingerichtet mit includeIf

11.04.2024

Wer häufig mit unterschiedlichen Git Benutzern arbeitet, kennt das Problem vielleicht: Man klont kurz ein Repo, committed einen Bugfix und beim Pushen dann der große D’oh-Moment[1] „Verflixt, falscher Benutzername verwendet!“

Repo falscher Benutzernahme verwendet

Bei meinem letzten Korrekturversuch hatte ich jedoch einen Überraschungsmoment: „Oh, doch der richtigen Name und die korrekte E-Mail Adresse. Wie kann das sein? Magie oder Hexerei?“

Tatsächlich ist Lösung recht einfach. So einfach, dass ich dessen Einrichtung schon wieder vergessen hatte.

Was ist passiert?

Regelmäßig klone ich Repositories, mal von GitLab, mal von GitHub, mal für die Arbeit, mal privat – jedoch meist mit unterschiedlichen Accounts, Benutzernamen und E-Mail Adressen.

Früher habe ich für jedes Repository eine projektspezifische git-config vorgenommen. Aber jedes Mal neu daran denken, diese einzurichten – nunja, das klappt nur mäßig. Deshalb bin ich auf Skripte umgestiegen, die zum Beispiel in meiner globalen git-config die Parameter user.name & user.email überschreiben. Klappt schon besser, weil ich so flexibel den Account wechseln kann, egal in welchem Tool ich gerade arbeite. Aber daran denken muss ich trotzdem.

Um den Wechsel per Skript nicht zu vergessen, habe ich es mir zur Gewohnheit gemacht, für jeden Account einen eigenen Unterordner zu verwenden:

C:\code\
├─ doubleSlash-github
   ├─ Repo-1
   ├─ Repo-2
├─ doubleSlash-gitlab
   ├─ Repo-1
   ├─ Repo-2
├─ private-github
   ├─ Repo-1

Aber wie erkennt Git beim letzten Commit den richtigen Benutzernamen, obwohl ich nach dem Klonen des Repos weder eine repository-spezifische git-config noch meine Skripte ausgeführt hatte? Es war kein Glück und auch keine Hexerei ;-)

git-config und das includeIf-Feature

Die Magie liegt in meiner benutzerspezifischen git-config und dem includeIf-Feature verborgen:

# ~/.gitconfig

# doubleSlash GitHub Account
[includeIf "gitdir:code/doubleSlash-github/"]
  [user]
    name = "Michael Goldschmidt (ds)"
    email = my-github-noreply-email@users.noreply.github.com

# doubleSlash GitLab Account
[includeIf "gitdir:code/doubleSlash-gitlab/"]
  [user] 
    name = "Michael Goldschmidt" 
    email = my@work.email
# Personal GitHub Account
[includeIf "gitdir:code/private-github/"]
  [user]
    name = "Michael Goldschmidt" 
    email = my@private.email
  [core]
    sshCommand = "ssh -i ~/.ssh/private-id_rsa"

Die includeIf-Blöcke sorgen dafür, dass abhängig vom Ordnerpfad meines Repositories Git die entsprechenden Konfigurationseinträge verwendet. In meinem Fall sind dies die Werte für user.name & user.email sowie gegebenenfalls das core.sshCommand.

Um die Übersicht zu bewahren, gehe ich noch einen Schritt weiter und binde für jeden Account eine separate git-config ein:

# ~/.gitconfig

# doubleSlash GitHub Account 
[includeIf "gitdir:code/doubleSlash-github/"] 
  path = ~/.gitconfig-ds-github

# doubleSlash GitLab Account 
[includeIf "gitdir:code/doubleSlash-gitlab/"] 
 path = ~/.gitconfig-ds-gitlab
# ~/.gitconfig-ds-github

[user]
  name = "Michael Goldschmidt (ds)" 
  email = my-github-noreply-email@users.noreply.github.com

Fazit

Ist die git-config mit dem includeIf-Feature einmal eingerichtet, funktioniert sie so zuverlässig, dass ich seither nicht mehr darüber nachdenken muss und das Feature beinahe vergessen hätte. Es funktioniert einfach.

(Und bevor ich es wieder vergesse -> Zeit es mit euch zu teilen!)

Quellen:

Zurück zur Übersicht

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*Pflichtfelder

*