Wenn ihr für eine Agentur oder selbstständig tätig seid, gleichzeitig aber auch persönliche Projekte habt, dann möchtet ihr vielleicht unterschiedliche Git-Konfigurationen für diese beiden Arten von Projekten verwenden. Wenn ihr euren Rechner aufsetzt, um an Projekten zu arbeiten, dann konfiguriert ihr einige grundlegende Tools wie Git und GitHub. Diese Einstellungen beinhalten in der Regel die Git-Autor E-Mail-Adresse und eventuell auch einen zugehörigen SSH/GPG-Key für die Signierung von Commits. Man kann normalerweise nur eine globale E-Mail-Adresse definieren, ihr verwendet hier dann also vermutlich die professionelle E-Mail-Adresse (des Unternehmens). Wenn ihr aber auch an privaten oder Open-Source-Projekten arbeiten wollt, dann bevorzugt ihr hier vielleicht eher eure persönliche GitHub E-Mail-Adresse. Diese Anleitung soll euch dabei helfen, das einzustellen.
Vorbereitung
In dieser Anleitung gehen wir davon aus, dass ihr PhpStorm verwendet und all eure Projekte, an denen ihr arbeitet, im Ordner ~/PhpstormProjects
gespeichert sind. Derselbe Ansatz funktioniert aber natürlich auch mit einer anderen IDE und einer anderen Ordnerstruktur.
Damit ihr zwei verschiedene E-Mail-Adressen mit GitHub verwenden könnt, müsst ihr diese erst einmal verifizieren. Anschließend könnt ihr bei jeder Aktion, wie etwa dem Merge eines PR auf github.com, auswählen, welche ihr verwenden möchtet. Die Verifizierung ist weiterhin notwendig, damit ihr sie für die Signierung von Commits verwenden könnt.
Aufteilung euer Konfiguration und bedingtes Laden der Dateien
Normalerweise speichert ihr alle Git-Konfigurationen in der Datei ~/.gitconfig
. Diese Datei könnte wie folgt aussehen:
[user]
name = Jo Doe
email = j.doe@company.com
signingkey = ~/.ssh/id_ed25519.pub
In jedem Projekt, in dem ihr nun einen Commit macht, würde die company.com E-Mail-Adresse verwendet und der Commit mit dieser signiert. Wenn ihr eine andere E-Mail-Adresse verwenden wollt, müsstet ihr diese manuell bei jedem Commit angeben:
git commit -m"message" --author="Jo Doe <1234567+jo.doe@users.noreply.github.com>" --gpg-sign=~/.ssh/id_ed25519.pub
Das ist natürlich nicht wirklich praktikabel und ihr vergesst diese zusätzlichen Parameter vielleicht manchmal. Alternativ könnt ihr auch die Autor-Einstellungen in der projektspezifischen Konfigurationsdatei angeben. Aber das müsstet ihr in jedem einzelnen geklonten Projekt tun.
Es ist zwar ebenfalls technisch möglich, die Autor-Daten nachträglich zu ändern, aber das ist alles andere als leicht und erfordert auch einen interaktiven Rebase, der die Historie überschreibt und daher nicht für bereits gepushte Commits verwendet werden darf. Wie können wir es also sonst erreichen?
Bedingtes Laden einer Konfigurationsdatei
Innerhalb einer Git-Konfigurationsdatei kann man mit includeIf eine Datei aufgrund einer Bedingung laden. Der einfachste Weg ist es hierbei, dies abhängig vom Projektordner zu tun. Wir speichern hierzu einfach alle persönlichen und Open-Source-Projekte direkt im ~/PhpstormProjects
Ordner und alle für das Unternehmen im Unterordner ~/PhpstormProjects/company
. Wir können dann die folgenden Zeilen in unsere globale Git-Konfiguration einfügen:
# file: ~/.gitconfig
[includeIf "gitdir:~/PhpstormProjects/"]
path = .gitconfig-general
[includeIf "gitdir:~/PhpstormProjects/company/"]
path = .gitconfig-company
Wir verschieben dann alle spezifischen Eisntellungen in diese beiden Dateien. Das werden in der Regel mindestens die gesamten [user]
Einstellungen sein, so wie eventuell noch ein paar mehr. Die allgemeine Datei könnte dann wie folgt aussehen:
# file: ~/.gitconfig-general
[user]
name = Jo Doe
email = 1234567+jo.doe@users.noreply.github.com
signingkey = ~/.ssh/id_ed25519.pub
In diesem Codeschnippsel habe ich die GitHub „noreply“ E-Mail-Adresse verwendet, die ihr anstelle eurer persönlichen E-Mail-Adresse einstellen könnt, damit diese private belibt und nicht für den Versand von Spam missbraucht wird.
Für den beruflichen company
Unterordner sieht die separate Konfigurationsdatei dann etwa so aus:
# file: ~/.gitconfig-company
[user]
name = Jo Doe
email = j.doe@company.com
signingkey = ~/.ssh/id_ed25519_company.pub
Diese beiden Dateien werden in eurem Homeverzeichnis neben der globalen .giconfig
Datei gespeichert. Wenn ihr weiter Einstellungen überschreiben möchtet, fügt sie einfach der jeweiligen Datei hinzu.
Auf der Git-Dokumentationsseite zu den includes findet ihr auch andere Bedingungen für das Laden von Dateien, unabhängig vom gitdir
. Ihr könnt beispielsweise auch eine Konfigurationsdatei abhängig von der Remote-URL laden. Damit wäre es dann auch möglich ein company
Repository in einen anderen Ordner als ~/PhpstormProjects/company/
zu klonen un trotzdem die .gitconfig-company
Datei zu laden. Aber es ist vermutlich einfacher zu verstehen, welche Datei geladen wird, wenn man nach dem Ordner geht.
Bonus: Verwaltung von GitHub-Benachrichtigungen für mehrere E-Mail-Adressen
Wenn ihr eine Einladung zu einer GitHub-Organisation erhaltet, dann werden ihr in der Regel automatisch alle Benachrichtigungen von allen Repositories abonniert. Da ihr GitHub vermutlich zuvor nur für private Projekte verwendet habt, erhaltet ihr diese Benachrichtigungen dann auch alle an die private E-Mail-Adresse. Glücklicherweise kann man ein Routing für Benachrichtigungen basierend auf der Organisation einstellen.
Um eine solche Routing-Regel einzustellen, navigiert ihr zu „Settings | Notifications“. Dort klickt ihr dann auf den „Custom Routing“ Button und dann auf den „Add new route“ Button. Anschließend wählt ihr die Organisation und die E-Mail-Adresse aus und klickt auf „Save“. Wenn ihr Einladungen zu mehreren Organisationen bekommen habt, könnt ihr auch mehrere Regeln anlegen.
Falls ihr gitlab.com für private/berufliche Projekte verwendet, dann könnt ihr pro Gruppe oder Projekt eine E-Mail-Adresse für die Benachrichtigungen auswählen. Diese findet ihr in eurem Profil unter „User Settings | Notifications“.
Fazit
Die gleichzeitige Arbeit an privaten und beruflichen Git-Projekten auf einem Gerät kann die Git-Autor-Daten eurer Commits ziemlich durcheinanderbringen. Aber mit dem bedingten Laden von Konfigurationsdateien kann spezifische Einstellungen für die verschiedenen Arten von Projekten festlegen.