git svn clone von lokalem Repository

Beim Versuch ein lokales SVN Repository mittels:

git svn clone --stdlayout svnrepo gitrepo

in ein Git Repository zu klonen, kam es zu folgender Fehlermeldung:

E: 'trunk' is not a complete URL and a separate URL is not specified

Die Lösung liegt hier an der richtigen Syntax des Pfades, so das es mit

git svn clone --stdlayout file:///home/seeseekey/svnrepo/ gitrepo

funktioniert.

Git Backstage bei Windows Developer

Heute erscheint die neue Ausgabe (7.13) des Magazins „Windows Developer„. Der Themenschwerpunkt der Ausgabe liegt dabei auf dem Thema Git in Verbindung mit dem Visual Studio und Windows.

Die aktuelle Ausgabe von Windows Developer

Die aktuelle Ausgabe von Windows Developer

Passend dazu gibt es von mir in dieser Ausgabe den 6-seitigen Artikel „Git Backstage“ welcher sich mit den physikalischen und logischen Speicherstrukturen und -mechanismen eines Git Repositories beschäftigt. Windows Developer kann dabei für 9,80 € am Kiosk bezogen werden.

Git Workflow

Einer der Vorteile von Git ist die große Freiheit welche einem das System gibt. Einer der Nachteile widerum ist die große Freiheit welche Git bietet. Deshalb sollte man sich für die Entwicklung in einem Git Repository einen Workflow zurechtlegen. Hier sei ein exemplarischer Workflow vorgestellt.

Der Git Standardbranch trägt den Namen „master“. In diesem Branch wird per Definition nichts entwickelt. Soll nun ein Feature implementiert oder ein Bug behoben werden, so wird dafür ein Branch eröffnet. Wenn das Feature im Branch implementiert und getestet ist, so kann es wieder in den „master“-Branch gemergt werden. Branches welche gemergt wurden und nicht mehr benötigt werden können dabei wieder entfernt werden. Das gleiche gilt für alte Tagbranches.

Der Vorteil der sich aus dieser Vorgehensweise ergibt, ist das der „master“ immer relativ stabil bleibt, da nur getestete Änderungen in ihn wandern. Außerdem kann man so mehrere Features parallel entwickeln. Bei der Benennung könnte man sich z.B. an folgendes Schema halten:

Featurebranch: feature-supportTiff
Bugfixbranch: bugfix-invalidFormatHandler
Tagbranch: tag-13.04

Interessant wird es wenn ein Release einer Software ansteht. Hier sollte man von der entsprechenden Software welche in einem Git Repository liegt einen Branch erstellen und diesen entsprechend benennen: z.B. als „tag-13.04“. In diesem Branch wird die Software auf Herz und Nieren getestet und auftretende Fehler behoben. Neue Features werden dabei nicht mehr entwickelt.

Wenn nun ein Fehler auftritt hat man drei Möglichkeiten damit umzugehen. Wenn der Fehler nur in dem Tagbranch auftaucht, wird er dort behoben, indem ein Bugfixbranch erzeugt wird, der Fehler behoben und der Bugfix getestet wird. Anschließend wird er wieder in den Tagbranch gemergt.

Ist der Fehler im „master“-Branch und im Tagbranch des aktuelles Releases enthalten, so wird ein Bugfixbranch vom „master“-Branch erstellt, der Fehler dort behoben und anschließend in den „master“ und in den Tagbranch zurückgemergt.

Dies funktioniert natürlich nur, wenn sich der „master“ und der Tagbranch nicht zu weit auseinander entwickelt haben. Ist der Fehler noch in beiden Branches vorhanden, die Unterschiede zwischen den selbigen aber zu gravierend, muss für jeden der beiden Branches ein Bugfixbranch erstellt werden und der Fehler in diesen Branches separat behoben werden. Anschließend wird das ganze in die entsprechenden Branches zurückgemergt.

Wenn alle gefundenen Fehler im Tagbranch behoben wurden bekommt der entsprechende Commit einen Tag in der Form „13.04“. Sollten später weitere Fehler beseitigt werden so werden diese im entsprechenden Tagbranch behoben und anschließend ein neuer Tag vergeben (z.B. „13.04.1“), welches das Bugfixrelease kennzeichnet.

Das ist natürlich nur ein Vorschlag für einen Workflow, der den eigenen Anforderungen unter Umständen angepasst werden muss. So könnte man für sich entscheiden das kleinere Fehler direkt im „master“-Branch behoben werden. Das liegt dann aber in der Verantwortung des Nutzers, der nach diesem Workflow arbeitet.

PuTTY SSH Schlüssel in OpenSSH Schlüssel umwandeln

Möchte man den privaten SSH Schlüssel welcher mittels des „PuTTY Key Generator“ erzeugt wurde auch in der „Git Bash“ nutzen, so muss man den Schlüssel in das OpenSSH Format bringen.

Der PuTTY Key Generator

Der PuTTY Key Generator

Dazu öffnet man den PuTTY Schlüssel mittels „File“ -> „Load private key“. Anschließend wird der Schlüssel über „Conversions“ -> „Export OpenSSH key“ in eine Datei mit dem Namen „id_rsa“ exportiert. Diese Datei wird dann in den Benutzerordner (z.B. „c:\Users\seeseekey\.ssh\“ unter Windows 7) gelegt. Anschließend kann der Schlüssel auch unter der Git Bash benutzt werden.

Git Repository in Subrepository verwandeln

Auf mactricks.de gibt es eine schöne Anleitung um aus einem Teil eines Git Repositories ein Subrepository zu erzeugen. Allerdings gibt es mit der Variante ein Problem. Wenn man das ganze mehr als zwei oder dreimal machen möchte, wird es mit der Zeit nervig all diese Befehle einzugeben.

Aus diesem Grund habe ich für das Extrahieren eines Subprojektes aus einem Git Repository ein Skript geschrieben:

#!/bin/sh
# extractSubproject <orignal repopath> <new repopath> <subfolder> <new remote (optional)>

# clone repository
git clone --no-hardlinks $1 $2

# extract subproject
cd $2
git filter-branch --subdirectory-filter $3 HEAD
git reset --hard
git remote rm origin
rm -r .git/refs/original/
git reflog expire --expire=now --all
git gc --aggressive
git prune

# Add optional remote and push
if [ "$4" != "" ]; then
git remote add origin $4
  git push origin master
fi

Heruntergeladen werden kann sich das Skript auch unter https://github.com/seeseekey/archive/blob/master/Bash/Git/extractSubproject.sh.