Git mit mehreren Identitäten am selben Client verwenden und commits mit den jeweils passenden GPG Schlüsseln signieren.

Git mit mehreren Identitäten


Wer regelmäßig mit unterschiedlichen Git-Identitäten arbeitet hat sicher schon das ein oder andere Mal mit dem “falschen” User Commits pushed.

In meinem aktuellen Projekt beim Kunden “SomeCustomer” arbeite ich mit einem eigenen GitLab-User thomas.hartl@somecustomer.com arbeiten, während ich bei evoila meinen GitHub-Unternehmensaccount thartl@evoila.com verwende. Um nicht bei jedem push den richtigen Benutzer auswählen zu müssen habe ich alle Projekte lokal in verschiedenen Verzeichnissen abgelegt:

/Projects
├─ evoila
│  ├─ Repository X
│  └─ Repository Y
└─ SomeCustomer
   └─ Repository Z

Diese Verzeichnisstruktur erlaubt es, mit Conditional Includes eine dynamische Git-Config zu bauen, die für jedes Repository automatisch den “richtigen” Benutzer wählt. Dazu lege ich drei Konfigurationsdateien in meinem Homedirectory an an:

  1. Meine .gitconfig enthält die Git “Basiskonfiguration” und zwei includeIf-Direktiven, die basierend auf dem Filter gitdir:<Verzeichnis> zwei verschiedene weitere Konfigurationdateien einbindet.
# .gitconfig
[includeIf "gitdir:/Projects/evoila/"]
  path = ~/.gitconfig.evoila

[includeIf "gitdir:/Projects/SomeCustomer/"]
  path = ~/.gitconfig.somecustomer
  1. Die .gitconfig.evoila-Datei enthält meine evoila-spezifischen Einstellungen, uA. meinen evoila-Benutzer und zugeordneten GPG-Schlüssel.
# .gitconfig.evoila
[user]
  name = Tom Hartl
  email = thartl@evoila.com
  signingkey = MNOPQRSTUVW98765
  1. Analog dazu enthält die .gitconfig.somecustomer-Datei Benutzer und GPG-Key für die GitLab-Instanz des Kunden.
# .gitconfig.somecustomer
[user]
  name = Thomas Hartl
  email = thomas.hartl@somecustomer.com
  signingkey = ABCDEFGHIJK12345

Mit dieser dynamischen Konfiguration muss ich nicht mehr darüber nachdenken, mit welchen Benutzer ich in welches Repo pushe, da Git - basierend auf dem Verzeichnis, in dem ich arbeite - automatisch den korrekten Benutzer auswählt. Zudem kann ich verschiedene GPG-Schlüssel zum signieren der Commits angeben.

Quellen