- In einer Umgebung, in der private und berufliche Repositories alle unter
~/workspaceliegen, ist es genauer, Git-Identitäten anhand der remote URL statt anhand des Ordnerpfads zu trennen - Git kann mit
includeIfpergitdirpfadabhängige Konfigurationen laden, aber wenn Repositories mehrerer Accounts im selben Arbeitsverzeichnis gemischt sind, stößt die pfadbasierte Verzweigung an ihre Grenzen - Mit der Bedingung
hasconfig:remote.*.url:lassen sich separate Konfigurationsdateien anhand von remote-URL-Mustern einbinden, etwa für GitHub, GitLab, SourceHut oder eine bestimmte GitHub-Organisation - SSH-Keys müssen separat in
~/.ssh/configüberHost,Hostname,UserundIdentityFileverwaltet werden; wer selbst bei demselbengithub.comorganisationsspezifische Keys verwenden will, braucht Host-Aliasse - Wenn zusätzlich
url.<base>.insteadOfgesetzt wird, kann man wie gewohntgit@github.com:orgname/projectverwenden, während Git dies intern durchgh-work:orgnameersetzt und so die richtige SSH-Konfiguration nutzt
Git-Konfiguration anhand der remote URL aufteilen
- Gängige
includeIf-Beispiele binden je nach lokalem Verzeichnispfad unterschiedliche Konfigurationsdateien ein, etwagitdir:~/code/**odergitdir:~/work/**- Unter
~/codelässt sich~/.config/git/personalladen, unter~/workdagegen~/.config/git/work - Die eingebundenen Dateien enthalten normalerweise Git-Identität und Signaturschlüssel wie
user.name,user.emailunduser.signingkey
- Unter
- Wenn sämtlicher Code unter
~/workspaceliegt, können private Repositories sowiework-1- undwork-2-Repositories in derselben Pfadstruktur gemischt sein; mit rein pfadbasierten Bedingungen ist die gewünschte Trennung dann schwierig - Mit Git
hasconfig:remote.*.url:kann eine Konfigurationsdatei nur dann eingebunden werden, wenn das aktuelle Repository eine bestimmte remote URL enthält- Passt
git@github.com:*/**, dann~/.config/git/config-gh - Passt
git@github.com:orgname/**, dann~/.config/git/config-gh-org - Passt
git@gitlab.com:*/**, dann~/.config/git/config-gl - Passt
git@git.sr.ht:*/**, dann~/.config/git/config-srht
- Passt
- Da Git die zuletzt passende Konfiguration einbindet, ist die Reihenfolge der Bedingungen wichtig
- Die Bedingung
github.com:orgname/**muss unterhalb der allgemeinen Bedingunggithub.com:*/**stehen, damit die organisationsspezifische Konfiguration nicht von der allgemeinen GitHub-Konfiguration überschrieben wird
- Die Bedingung
- Im Ergebnis verwenden Repositories mit einem
github.com:orgname/**-remoteconfig-gh-org, während andere GitHub-Repositories die allgemeine GitHub-Konfiguration nutzen
SSH-Keys und insteadOf nutzen, um organisationsspezifische Verbindungsdaten zuzuordnen
- Unabhängig von der Git-Identität ist für
pullundpushauf einem remote eine SSH-Key-Konfiguration nötig- Für
gitlab.comlässt sich in~/.ssh/configetwa~/.ssh/gitlab.id_ed25519angeben - Für
github.comlässt sich perIdentityFileentsprechend~/.ssh/github.id_ed25519festlegen
- Für
- Je nach
ssh-agent-Konfiguration kann es sinnvoll sein, unter demIdentityFiledes jeweiligenHostzusätzlichIdentitiesOnly yeszu setzen - Wer bei demselben
Hostnamegithub.comje nach Organisation unterschiedliche Keys nutzen möchte, muss unterschiedliche Werte fürHostverwenden- Die Konfiguration hat die Form
Host gh-work,Hostname github.com,User git,IdentityFile ~/.ssh/work.id_ed25519
- Die Konfiguration hat die Form
- Mit
url "gh-work:orgname"in der Git-Konfiguration undinsteadOf = git@github.com:orgnamelassen sich Git-URLs automatisch umschreiben- Der Nutzer gibt etwas wie
git clone git@github.com:orgname/projectein - Git ersetzt den Teil
github.com:orgnamedurchgh-work:orgnameund verwendet dadurch diegh-work-Konfiguration aus~/.ssh/config
- Der Nutzer gibt etwas wie
- Dieser Ansatz ist ein Trick aus SSH and multiple Git credentials; die gemeinsam herangezogenen Artikel sind:
1 Kommentare
Kommentare auf Hacker News
Statt
insteadOfzu verwenden, klont man das Repository alsgh-work:org/repound setzt in der Git-KonfigurationincludeIf "hasconfig:remote.*.url:gh-work:**/**"So übernehmen Repositories, die mit der unter
gh-workdefinierten SSH-Identität geklont wurden, automatisch die Konfiguration ausgh-work.inc; darin stehen der Git-Identität entsprechende Signaturschlüssel und die SSH-KonfigurationAm Ende wird der Name
gh-workzum Unterscheidungsmerkmal zwischen SSH-Identität und Git-Identität, was leichter verständlich istincludeIfist case-sensitive, und bei der Priorität gewinnt die zuletzt gesetzte KonfigurationUm zu prüfen, ob es korrekt funktioniert, kann man
git remote get-url originundgit config --get user.emailausführenIch halte es für besser, in der
.gitconfigunterHOMEidentitätsspezifische Aliasse zu hinterlegen und direkt nach dem Initialisieren oder Klonen eines Repositoriesgit config-companyodergit config-personalauszuführenMan aktiviert
user.useConfigOnly = trueund lässt die Aliasse im lokalen Repositoryuser.email,user.nameundcore.sshCommandjeweils auf den privaten bzw. geschäftlichen SSH-Key setzenDer Vorteil der Methode aus dem Artikel scheint zu sein, dass es einfach funktioniert, wenn man aus der Organisation klont
Bei einem früheren Startup gab es jemanden, der seine Identität jeden Tag auf irgendeinen märchenhaften Namen änderte
Montags-Commits waren von Mr. Bunnymann, Dienstags-Commits von Doctor Funtime und so weiter; das war bei Versionskontroll-Forensik extrem unpraktisch
Wohlwollend betrachtet wollte er vielleicht daran erinnern, dass jeder beliebige Werte in die Identitätseinstellungen schreiben kann und man diesen Werten nicht zu sehr vertrauen sollte
Trotzdem hilft es, zu wissen, wer es war, wenn man Details nachfragen oder Stil und Fachkenntnis einschätzen will
Wenn man GPG-Signaturen für Commits verlangt und zulässige GPG-Identitäten registriert, kann man den tatsächlichen Autor über die Signatur statt über Autor-/Committer-Metadaten identifizieren
Natürlich passen „einfach“ und GPG-Signaturen nicht immer gut zusammen
Wenn man Mitarbeitenden nicht zutraut, ihre eigenen Commits korrekt zu kennzeichnen, sollte man sie meiner Meinung nach entlassen
Ohne
~/.ssh/configanzufassen, kann man in~/.gitconfigoder wie im Artikel in~/.config/git/personalcore.sshCommand = /usr/bin/ssh -o IdentitiesOnly=yes -i ~/.ssh/IdentityFile2 -aeintragenDamit werden Submodule auch ohne
insteadOfeinfacherIch nutze schon lange verzeichnisbasiertes
includeIf(https://www.bobek.cz/til/git-identities/), aberhasconfig:remoteist wirklich sauberEs funktioniert sogar beim Klonen eines Repositories
includeIfist ziemlich gutAktuell halte ich die SSH-Komplexität in
~/.sshund habe je Kunde/Projekt/Identität jeweils ein IncludeFür Dinge wie GitHub, bei denen es keinen eindeutigen Hostnamen gibt, verwende ich einen Host-Alias wie
customer-githubund konfiguriere ihn mitHostName github.com,IdentityFile ~/.ssh/customer_rsa,User gitDanach muss man bei
git clonenur noch diesen Alias verwendenIch hatte dasselbe Problem, und jetzt gibt es also eine Lösung
Mit NixOS und home-manager unter Linux und Mac wird diese Konfiguration einfach
In
programs.git.includesträgt mancondition = "hasconfig:remote.*.url:git@github.com:/**"und die Einstellung füruser.emaileinSiehe: https://nix-community.github.io/home-manager/options.xhtml#opt-programs.git.includes
.gitconfigzu schreibenEs sind dieselbe Bedingung und dieselbe Einstellung wie im Artikel, nur kommen hier noch ein Build-/Template-Schritt und das Lernen einer neuen Programmiersprache mit ungewöhnlicher Syntax dazu
Ich hatte Arbeit und private Konfiguration bereits mit
includeIf: "gitdir"getrennt, aberhasconfig:remoteist ein echter GamechangerConsultants empfehle ich immer nachdrücklich, für die Arbeit eine separate Maschine zu verwenden oder mindestens einen separaten OS-Benutzer
Wer eine private Maschine für die Arbeit nutzt, läuft Gefahr, in große Schwierigkeiten zu geraten
Es gibt Fälle, in denen man bei einem remote-first Unternehmen den Laptop selbst stellt und alle 2–3 Jahre Geld für ein neues Gerät bekommt, es aber trotzdem der private Laptop bleibt; oder man ist nur befristeter Contractor
Man sollte genauer erklären, in welchen Situationen warum ein Problem entsteht
Die Risiken sind real, aber wenn man sie nicht aufzählen kann, ist es weniger Aufklärung als das Verbreiten von FUD
Ein Tool, das ich gebaut habe, um die Git-Identität pro Projekt einfach zu wechseln: https://github.com/cquintana92/git-switch-user
Nachdem man die Identitäten eingerichtet hat, führt man
$ git su Personaloder$ git su Workaus, und E-Mail, Name, SSH-Key sowie optional ein PGP-Key werden in der.git/configdes Repositories gesetztDas hat mir viel Zeit gespart
Es ist 12 Jahre alt, wird aber noch aktiv gepflegt