Ein Monotone-Repository zu Git exportieren
Seit fast 15 Jahren verwende ich Monotone als Versionsverwaltungssystem. Zunächst nur hier und da, zum Testen und für neue Repositories, dann intensiver während ich anderthalb Jahre lang an einem Projekt bei der HTWK Leipzig beteiligt war und schließlich stellte ich alle meine CVS-Repositories auf Monotone um.
Zehn Jahre nach meinem Buch zu diesem Versionsverwaltungssystem und sieben Jahre nach meinem letzten Artikel dazu habe ich mich entschlossen, meine Monotone-Repositories nach Git umzuziehen.
Natürlich will ich zumindest bei einigen Repositories die History behalten,
wie seinerzeit beim Umzug von CVS zu Monotone.
Darum reicht es nicht,
einfach den letzten Stand in ein leeres Git-Repository einzuspielen.
Stattdessen exportiere ich die gesamte History mit mtn git_export
und importiere sie mit git fast-import
:
git init gitrepo
cd gitrepo
( cd path/to/mtnworkspace; mtn git_export) \
| git fast-import
Anschließend habe ich alle Branches und Commits aus der Datenbank, die das Monotone-Repository zu diesem Workspace hält, und muss sie nur noch auschecken, um mit Git weiter zu arbeiten.
Dabei heißen die Git-Branches genauso wie bei Monotone. Bei mir fangen fast alle Namen von Branches mit net.mamawe. beziehungsweise mit de.in-bad-schmiedeberg. an. In der Monotone-Datenbank können sich Zweige völlig verschiedener Projekte befinden, die ich mit Git sortieren muss.
Darum wähle ich einen Zweig aus, checke ihn mit Git aus und erzeuge dort einen Zweig main, den ich auf einem Remote-Repository sichere:
git branch
git checkout monotone.branch
git checkout -b main
git remote add origin url:to/server/repo
git push --set-upstream origin main
Für ein anderes Projekt, welches sich in der gleichen Datenbank befand, entferne ich den Zweig main wieder und wiederhole die Prozedur, bis ich alle Projekte auf verschiedene Git-Repositories verteilt habe.
Neben den Repositories bei GitHub habe ich einen SSH-Account auf einem Server, der für Git-Repositories reserviert ist. Auf diesem melde ich mich an, um ein leeres Repositories anzulegen, das ich dann als upstream verwende:
ssh user@server
git init --bare repository.git
exit
Die Git-URL für dieses Repository lautet dann
user@server:repository.git
.
Will ich in einem Workspace Git statt Monotone verwenden, verschiebe ich einfach das alte Verzeichnis und klone das Git-Repository an dieselbe Stelle:
cd parent/of/mtnworkspace
mv mtnworkspace mtnworkspace.orig
git clone url:to/server/repo mtnworkspace
Will ich hingegen noch eine Zeit lang beide VCS im selben Workspace verwenden, gehe ich stattdessen wie folgt vor:
cd path/to/mtnworkspace
git init .
git remote add -t '*' -f origin url:/to/server/repo
git checkout -f main
Das birgt das Risiko, dass ich mir beim Umstellen die Dateien zerstöre. Da ich diese jedoch in zwei verschiedenen VCS habe, kann ich das sehr einfach mit folgenden Befehlen kontrollieren:
mtn status
git status
Anschließend kann ich denselben Workspace mit beiden VCS verwalten, muss allerdings die Commits sowohl mit Git als auch mit Monotone ausführen.
Updates:
- 2021-05-22: Befehle für Upstream-Repositories von Git korrigiert.
- 2021-05-18: Befehle für Upstream-Repositories von Git ergänzt.