Schlagwort-Archive: Git

Mercurial Repositories nach Git konvertieren mit fast-export

Schon seit längerem verwalte ich meine Entwicklungsprojekte mit einer verteilten Versionsverwaltung. Habe ich früher Mercurial verwendet, weil es besser unter Windows verfügbar und integriert war, so bin ich inzwischen auf das angesagte Git umgestiegen, das ja vor allem durch die breite Verwendung von github populär ist. Zur Vereinheitlichung will ich alles mit Git verwalten und dazu natürlich die Mercurial-Repositories verlustfrei in Git-Repositories umwandeln. Dies ist gar nicht so schwer, und so will ich dem Netz dazu mal eine deutschsprachige Anleitung dazu reichen.

Diese Anleitung geht Fragen (1, 2) in stackoverflow zurück, wird also von mir hier nur neu präsentiert. Als Werkzeug wird dabei fast-import verwendet, das es unter https://github.com/frej/fast-export gibt und dort auch erklärt ist. Auf meinem Mint Linux (Ubuntu Derivat) lies es sich ganz leicht installieren mit

sudo apt-get install hg-fast-export

Dies holt auch alle nötigen Pakete wie Mercurial etc. nach. Unter Windows habe ich es nicht getestet, da dort meist kein Python vorhanden ist.

Zur Anwendung sei als Illustration ein kleines shell-Script angegeben, das im Verzeichnis über dem Projektverzeichnis mit dessen Namen als Parameter aufgerufen wird. Das alte Projektverzeichnis wird mit der Endung .bak umbenannt und steht nachher als Backup noch zu Verfügung. Nach der Anwendung steht das Verzeichnis wieder unter dem alten Namen, jedoch mit .git Respository, zur Verfügung.

#!/bin/sh
projectdir=$1
[ $# -eq 0 ] && { echo "Usage: $0 subdir_with_hg_project"; exit 1; }
bakdir=$projectdir'.bak'

mv $projectdir $bakdir
git init $projectdir
cd $projectdir
hg-fast-export -r ../$bakdir
git checkout HEAD
# undo last commit, if we had changed files in hg and did commit just for completeness
# git reset HEAD~
# remove old project directory, if not needed any more
# rm -rf ../$bakdir

Es wird dabei ein leeres Verzeichnis mit git init initialisiert und dann das Git Repository durch hg-fast-export mit sukzessiven Commits befüllt. Danach ist es dem Mercurial-Repository gleichwertig. Zu den Dateien kommt man erst mit git checkout HEAD, da diese zuerst nur im Repository hinterlegt sind.

Ist das Mercurial-Verzeichnis noch mit offenen Änderungen versehen, so muss man diese vor dem Übertragen commiten, damit sie mit übertragen werden. Der letzte, eigentlich unerwünschte Commit kann dann mit git reset HEAD~ im Git-Verzeichnis ungeschehen gemacht werden. In der IDE netbeans kann dies auch mit der hervorragenden Git-Integration unter Team > Revert/Recover > Reset mit der Option Modify Working Tree (--mixed) gemacht werden.