Skip to content

Tips und Tricks für den Umgang mit git

Bei meiner Arbeit mit git stehe ich immer wieder vor der Frage, ob man dieses oder jenes damit nicht einfach machen können müßte. Meistens lautet die Antwort auf diese Frage "ja", aber teilweise muß man schon etwas googeln, um diese Antwort zu finden. :-) Daher möchte ich ab und an kleine ergoogelte Wissensschnippsel mit der Leserschaft teilen; vielleicht steht ja noch einmal jemand anderes vor demelben Problem (und überdies sind deutschsprachige Informationen zu git nicht so wirklich umfänglich vorhanden).

Git über SSH und mehrere SSH-Keys pro Host

Mehr eine allgemeine SSH-Frage, aber da sie sich mir im Zusammenhang mit git gestellt hat …

Ein beliebter Zugriffsweg auf Git-Repositories ist der über SSH, insbesondere, wenn es auch um einen schreibenden Zugang geht und man diesen authentifizieren will. Zu diesem Zweck kann man sich den passenden SSH-Schlüssel für den Zugriff auf das Git-Repository über die SSH-Konfiguration definieren, bspw. durch einen Eintrag in ~/.ssh/config wie den folgenden:

Host git.example.org<br />Port 2022<br />IdentityFile ~/.ssh/gitkey

SSH-Zugriffe auf den Server "git.example.org"  erfolgen also auf Port 2022 (statt 22) und unter Verwendung des Schlüssels "gitkey". Der Git-Zugriff via SSH berücksichtigt diese Einstellungen dann automatisch.

Was aber tun, wenn man von demselben Client mit mehreren verschiedenen SSH-Schlüsseln auf denselben Server zugreifen muß, wie es insbesondere bei der Verwendung von Tools wie gitosis auf der Serverseite vorkommen kann? Dieselbe Frage stellt sich natürlich, wenn man sich neben dem Zugriff auf ein Git-Repository auch ganz normal per SSH auf dem Server einloggen können will. Auf die obige Art und Weise läßt sich nur ein Key für den Zugriff auf "git.example.org" vordefinieren - und will man wirklich immer einen abweichenden Schlüssel per Option angeben? Eine Lösung wäre die Vergabe von weiteren CNAMEs im DNS für git.example.org, aber das skaliert auf die Dauer auch nicht.

Die einfachste Lösung dafür bieten Aliase direkt in der SSH-Konfiguration, wie das Git-Wiki empfiehlt:

Host private.example.com
    User myname
    Hostname git.example.com
    IdentityFile ~/.ssh/private-identity
Host public.example.com
    User groupname
    Hostname git.example.com
    IdentityFile ~/.ssh/public-identity

Auf diese Art und Weise kann man denselben Server mit zwei verschiedenen Konfigurationen ansprechen.

Übernahme einer einzelnen Datei aus einem anderen Branch

Alle Änderungen aus einem anderen Entwicklungszweig zu übernehmen ist einfach und geht per merge; nur bestimmte Änderungen (commits) zu übernehmen funktioniert via cherry-pick. (Warum auch immer das Rosinenpicken der Deutschen dem Angelsachsen ein Picken nach Kirschen ist …) Aber wie kann man eine bestimmte Datei - also alle Änderungen, aber nur die in einer bestimmten Datei - aus einem anderen Branch übernehmen?

Zu dieser Frage hat Jason Rudolph die passende Antwort: das geht mit git-checkout, und zwar in der Form git checkout $branch $path. Nehmen wir an, ich möchte die Fassung der Datei "README" aus dem Branch "test" in meinen Branch "master" übernehmen, aber eben nur diese Datei in genau dem Zustand, den sie im "test"-Branch hat. Das geht dann folgendermaßen:

git checkout master
git checkout test README
git commit -m 'Imported README from test branch'

Genauso funktioniert das natürlich mit mehreren Dateien:

git checkout test README doc/explanation.txt doc/TODO

Voilà. Soviel für heute. :-)


Trackbacks

Keine Trackbacks

Kommentare

Ansicht der Kommentare: Linear | Verschachtelt

Noch keine Kommentare

Kommentar schreiben

HTML-Tags werden in ihre Entities umgewandelt.
Markdown-Formatierung erlaubt
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
BBCode-Formatierung erlaubt
Gravatar, Identicon/Ycon Autoren-Bilder werden unterstützt.
Formular-Optionen
tweetbackcheck