Sonntag, Oktober 03, 2010

GIT, Putty and SSH auth (Windows)

Ich hatte heute morgen Problem beim Zugriff auf mein GIT-Repository. Eigentlich hatte es immer super geklappt, allerdings habe ich auf dem Rechner nur die Portable Version von msysgit benutzt. Also mal wieder das typische Googlen bis man was findet, etwas passendes zu finden, war aber eher ein Glücksspiel. Zumindest wußte ich zu 90% was ich zu tun habe.

Zu erst benötigt man natürlich GIT, unter Windows würde ich derzeit immer auf msysgit zurückgreifen. Außerdem werden für Zugriff auf Repositories mit SSH/Public Key Access noch die Putty-Tools benötigt, eigentlich braucht man nur pageant.exe, plink.exe und puttygen.exe.

Zuerst erzeugt man sich ein einen Private-Key mittels puttygen erzeugen. Nach dem das Zertifikat erstellt wurde, muss dieses nur noch gespeichert werden. A

PuttGen Interface after Key has been created.

Außerdem sollte man den Text für Public Key kopieren. Dieser wird für den Import bei dem GIT-Anbieter oder Server benötigt, genauso wie bei vielen anderen Applikationen. Bei Unfuddle zum Beispiel wird der Key beim Benutzer registriert und ermöglicht erst dadurch die Authentifizierung und den Zugriff auf das Repository.

Den gespeicherten Private-Key (ppk-Erweiterung) öffnen man nun mit pageant. Um den Key zu lesen muss die Passphrase angegeben werden.

pageant-opened

Ist der Key geöffnet, so kann man versuchen das Repository zu öffnen. Dazu "plink.exe –v git@<project>.unfuddle.com:user/<projectrepo>.git" ausführen. Die Antwort sollte dann etwa so aussehen:

   1: Looking up host "<project>.unfuddle.com"
   2: Connecting to 174.129.5.196 port 22
   3: Server version: SSH-2.0-OpenSSH_5.1p1 Debian-5
   4: We claim version: SSH-2.0-PuTTY_Release_0.60
   5: Using SSH protocol version 2
   6: Doing Diffie-Hellman group exchange
   7: Doing Diffie-Hellman key exchange with hash SHA-256
   8: Host key fingerprint is:
   9: ssh-rsa 2048 a6:74:33:36:95:31:6e:a6:d7:71:87:b8:3c:38:e2:60
  10: Initialised AES-256 SDCTR client->server encryption
  11: Initialised HMAC-SHA1 client->server MAC algorithm
  12: Initialised AES-256 SDCTR server->client encryption
  13: Initialised HMAC-SHA1 server->client MAC algorithm
  14: Pageant is running. Requesting keys.
  15: Pageant has 1 SSH-2 keys
  16: Using username "git".
  17: Trying Pageant key #0
  18: Remote debug message: Forced command: gitosis-serve <user>_<user>
  19: Remote debug message: Port forwarding disabled.
  20: Remote debug message: X11 forwarding disabled.
  21: Remote debug message: Agent forwarding disabled.
  22: Remote debug message: Pty allocation disabled.
  23: Authenticating with public key "<key comment>" from agent
  24:  
  25: Sending Pageant's response
  26: Remote debug message: Forced command: gitosis-serve <user>_<user>
  27: Remote debug message: Port forwarding disabled.
  28: Remote debug message: X11 forwarding disabled.
  29: Remote debug message: Agent forwarding disabled.
  30: Remote debug message: Pty allocation disabled.
  31: Access granted
  32: Opened channel for session
  33: Server refused to allocate pty
  34: Started a shell/command
  35: ERROR:gitosis.serve.main:Need SSH_ORIGINAL_COMMAND in environment.
  36: Server sent command exit status 1
  37: Disconnected: All channels closed

Evtl. kann eine Bestätigung des Server Keys notwendig sein, dass sollte allerdings nur beim 1. mal der Fall sein.

Hat der Teil geklappt, dann fehlt nur noch git korrekt zu konfigurieren. Hat mit den msysgit installer benutzt und die Option plink.exe während der Installation ausgewählt, so sollte bereits alles funktionieren, anderenfalls muss noch etwas nachgearbeitet werden. Um git beizubringen, dass er mittels pageant/plink sich authentifizieren soll, muss noch eine Umgebungsvariable gesetzt werden.

   1: GIT_SSH=<path to plink>\plink.exe

Anschließend kann mit git auf das Repo zugegriffen werden

Der Zugriff kann durch registrieren des Remote-Repo ordentlich verkürzt und vereinfacht werden. Beim erzeugen des Repo mit git clone … sollte das bereits passiert sein.

Hier noch mal ein kleiner Git-Ablauf (nach meinem Verständnis)

   1: cd myproject
   2: git init
   3: git remote add unfuddle git@<project>.unfuddle.com:<user>/<repo>.git
   4: git config remote.unfuddle.push refs/heads/master:refs/heads/master
   5: git pull unfuddle master
   6: git checkout -b dev
   7: ... changes ...
   8: git add **/*
   9: git commit -a -s -m ""
  10: git checkout master
  11: git merge dev
  12: git push unfuddle master

In der ersten Zeile wird in ein leeres Verzeichnis gewechselt und anschließend das Repository angelegt. Zeile 3 und 4 registrieren das Remote-Repository, so dass in Zeile 5 mit unfuddle auf dem Repo zugegriffen werden kann. Zum arbeiten wird dann in einen neuen Branch dev gewechselt. Anschließend können die Arbeiten durchgeführt werden. mittels git add werden neue Dateien für das Change-Tracking und den anschließenden Commit registriert. Mittels commit werden die Änderungen lokal übernommen. Der Parameter "-s" sorgt dabei für das hinzufügen des "Sign-off"/Abzeichnen und der Parameter –a übernimmt alle Änderungen in den Commit. Danach wird zum "Hochschieben" der Änderungen in den master gewechselt und die Änderungen aus dem "dev" Zweig übernommen. Git push shiebt in Zeile 12 die Änderungen ins Repository.

Weiterhin sind die Befehle git init/git gui zu empfehlen, ich nutze diese immer wieder mal. Manche Sachen sind einfach nicht geläufig.

Hier sind noch einige interessante Links: