Windows Dev Story: Git in WSL2 (richtig) konfigurieren

An unserem letzten Slackday – der hier bei uns in der Mayflower-Kultur Mayday genannt wird – haben wir zusammen mit den Kollegen unseren Firmen-Twitch-Channel erstellt. Und ich durfte als Erster streamen (juhu).

<werbung> Folgt uns gerne auf Twitch. Dort versuchen wir zumindest an jedem Mayday mindestens eine Session Live zu übertragen. </werbung>

Da mein mobiler Arbeitsplatz nicht stark genug war um das Video-Encoding korrekt hinzubekommen, musste ich schnell auf einen leistungsstarken PC umsteigen – und, nun ja … da lief Windows mit WSL2 drauf. Spätestens ab hier wird es spannend.

Git in WSL2

Denn alleine schon Git richtig zu konfigurieren, kann in einem WSL2-Setup mit einer oder mehreren Maschinen zur Challenge werden. Vor allem, weil das Internet bei Problemen in dem Kontext auch nur sehr beschränkt weiterhilft.

Bevor wir loslegen ist es glaube ich wichtig anzumerken, dass man Git auf zwei Arten verwenden kann:

  • Basic Auth (https://github.com/<user>/<project>.git)
  • SSH Key (git@github.com:<user>/<project>.git)

Hinweis

github.com dient hier lediglich als Beispiel!

Wer jetzt viel auf und mit Unix-Systemen gearbeitet hat, der hat vielleicht vergessen, dass es eben auch die Basic-Auth-Methode gibt. Zumindest ging es mir so; darum hat es auch sehr lange gedauert, das Folgende aufzusetzen.

Option 1: Git Credential Manager

Der Git Credential Manager (GCM) ist – einfach gesagt – ein Cross-Plattform-Interface zwischen den OAuth2 Authorization-Flows diverser großer Git-Hoster (Github, Gitlab, Bitbucket, …) und den System-spezifischen Secret Stores (Windows Credential Manager unter Windows und die login keychain unter macOS).

Und ja, damit unterstützt er eben auch Basic Auth über HTTPS.

Ach ja, habe ich schon erwähnt, dass er sich 1A mit unseren WSL-Systemen verheiraten lässt?

Git Credential Manager

Der Git Credential Manager wird bei einer Normalinstallation von Git unter Windows standardmässig installiert. Mehr Informationen zur Installation findet ihr hier.

Nachdem Git auf dem Windows-Host installiert wurde, können wir unser WSL jetzt so konfigurieren, dass es den GCM vom Windows-Host-System nutzt:

# In unserer PowerShell
wsl

# Oder um in die nicht default WSL zu gelangen
wsl -d Ubuntu

# Ab hier befinden wir uns in der WSL VM
# Nun nur noch Git installieren, unter Ubuntu z.B.:
apt-get install git
# Fuer alle anderen Linux Distributionen einfach in der Git Doku nachschlagen (https://git-scm.com/download/linux)

# Minimal Git Konfig
git config --global user.name "Max Mustermann"
git config --global user.email "max.mustermann@example.com"
    
# Und jetzt kommt der WICHTIGE Teil
git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/libexec/git-core/git-credential-manager-core.exe"

Der letzte Befehl in dem Beispiel macht die ganze Magie: nun kann man einfach ganz normal mit git arbeiten. Bei der ersten Verbindung geht ein Browserfenster auf, in dem man sich einloggen kann.

Und ja, das funktioniert sogar ohne jegliche weitere Konfiguration auch innerhalb von Visual Studio Code Remote Containers, solange Docker mit dem WSL2-Backend läuft.

Konfiguration

Damit der GCM greift, muss sichergestellt sein, dass unser git remote mit der entsprechenden HTTPS URL konfiguriert ist. Dafür können wir innerhalb unseres <project-dir> einfach ein git remote show origin ausführen und ggf. die URL mir git remote --set-url origin https://github.com/<user>/<project>.git überschreiben.

Option 2: SSK-Key

Gerade der Ansatz der auf allen meinen anderen Dev-Host-Systemen der Gängige ist, enttarnt sich unter Windows als die komplexere Option. Aber warum ist das so?

SSH-Keys sind eigentlich nicht dafür da, geteilt zu werden. Und da jeder einzelne WSL2-Host ein eigenes, vollständig virtuelles Linux ist, müssten wir dafür theoretisch auf jedem auch eigene SSH-Keys generieren, die wir dann anschliessend bei dem Git-Hoster unserer Wahl hinterlegen können.

Das kann man schon so machen. Ich kann aber auch verstehen, wenn man nur ein Key Pair haben möchte – und zwar das vom Windows-Host.

Ich will hier gar nicht im Detail beschreiben wie das geht; hierzu gibt es nämlich – im Gegenteil zum Git Credential Manager – sehr schöne Blog-Posts, die zeigen, wie man das machen kann.

Zum Beispiel erklärt der Blog-Post Sharing SSH keys between Windows and WSL 2 von Burke Holland, wie man SSH-Keys vom Host-System in seine jeweiligen WSL2-Systeme kopieren kann.

Während der Blog-Post Forwarding SSH Agent requests from WSL to Windows von Stuart Leeks super erklärt, wie man SSH Agent requests von einem WSL auf den Windows-Host weiterleiten kann. Im Gegensatz zum vorherigen Ansatz müssen wir dafür nicht den SSH-Key in das WSL-System kopieren.

Und zum Abschluss gibt es noch ein kleines Caveat für alle, die mit Visual Studio Code, WSL2 und Remote-Containern Probleme haben.

VSC in Kombination mit der Remote-Containers-Extension

Um Git auch innerhalb des Dev-Containers verwenden zu können, muss sichergestellt sein, dass der SSH-Key vom Windows-Host im VSC-Backend hinterlegt ist (auch wenn VS Code mit code <project-dir> von innerhalb einer WSL2-Instanz gestartet wurde):

Achtung!

Wichtig ist es hierbei, die folgenden Kommandos von der PowerShell aus auszuführen und NICHT von der Git Bash. Die Git Bash bringt ihr eigenes gebündeltes OpenSSH mit, Visual Studio Code aber forwarded den ssh-agent vom Windows-Host-System!
Der von der Git Bash gebündelte ssh-agent liegt unter C:\Program Files\Git\usr\bin, während der Windows-ssh-agent unter C:\Windows\System32\OpenSSH liegt!
# Standardmaessig ist der ssh-agent-Service deaktiviert. Mit folgendem Kommando erlauben wir das manuelle starten des Services.
# Stelle sicher, dass Du die PowerShell als Administrator ausgefuehrt hast.
Get-Service ssh-agent | Set-Service -StartupType Manual

# Starte den Service
Start-Service ssh-agent

# Sollte den Status "Running" zurueckgeben
Get-Service ssh-agent

# Jetzt lade deine SSH-Key-Dateien in den ssh-agent
ssh-add ~\.ssh\id_ed25519

Zum Schluss noch ein Pro-Tipp: Um den ssh-agent nicht nach jedem Windows-Neustart manuell starten zu müssen, empfiehlt sich folgender Befehl:

Get-Service ssh-agent | Set-Service -StartupType Automatic

Quellen

Für neue Blogupdates anmelden:


Schreibe einen Kommentar

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