web-dev-qa-db-de.com

Mercurial-Projekt in Git konvertieren

Ich muss ein Mercurial-Projekt in ein Git-Projekt konvertieren, möchte aber den Commit-Verlauf beibehalten. Meine aktuelle Lösung bestand darin, nur hg-bezogene Dateien zu entfernen und dann git init && manuell die Dateien hinzuzufügen, die ich brauchte, aber das würde den Verlauf nicht behalten. Gibt es dafür irgendwelche Lösungen?

256
gandolf

Sie können versuchen, Fast-Export zu verwenden:

cd ~
git clone https://github.com/frej/fast-export.git
git init git_repo
cd git_repo
~/fast-export/hg-fast-export.sh -r /path/to/old/Mercurial_repo
git checkout HEAD

Schauen Sie sich auch this SO question an.


Wenn Sie eine Mercurial-Version unter 4.6 verwenden, adrihan haben Sie den Rücken frei:

Wie er in seinem Kommentar feststellte: "Wenn Sie Mercurial <4.6 verwenden und der Fehler" revsymbol not found "angezeigt wird, müssen Sie Ihr Mercurial aktualisieren oder den schnellen Export herunterstufen, indem Sie git checkout tags ausführen/v180317 im Verzeichnis ~/fast-export. ".

259
akluth

Ok, ich habe es endlich geschafft. Dies verwendet TortoiseHg unter Windows. Wenn Sie dies nicht verwenden, können Sie dies über die Befehlszeile tun.

  1. Installieren Sie TortoiseHg
  2. Klicken Sie mit der rechten Maustaste auf eine leere Stelle im Explorer und gehen Sie zu den TortoiseHg-Einstellungen:

TortoiseHg Settings

  1. hggit aktivieren:

enter image description here

  1. Öffnen Sie eine Befehlszeile und geben Sie ein leeres Verzeichnis ein.

  2. git init --bare .git (Wenn Sie kein nacktes Repo verwenden, erhalten Sie eine Fehlermeldung wie abort: git remote error: refs/heads/master failed to update

  3. cd in Ihr Mercurial-Repository.

  4. hg bookmarks hg

  5. hg Push c:/path/to/your/git/repo

  6. Im Git-Verzeichnis: git config --bool core.bare false (Frag mich nicht warum. Irgendwas über "Arbeitsbäume". Git ist ernsthaft unfreundlich. Ich schwöre, das Schreiben des eigentlichen Codes ist einfacher als das Verwenden von Git.)

Hoffentlich klappt es und dann kannst du von diesem neuen Git-Repo auf ein nicht nacktes Repo pushen.

79
Timmmm

Wenn Sie Ihr vorhandenes Mercurial-Repository in ein 'GitHub'-Repository importieren möchten, können Sie jetzt einfach den GitHub-Importer verwenden, der hier verfügbar ist [ Anmeldung erforderlich]. Nie mehr herumspielen mit schnell exportieren usw. (obwohl es ein sehr gutes Werkzeug ist)

Sie erhalten alle Ihre Commits , Zweige und Tags intakt. Eine weitere coole Sache ist, dass Sie auch die E-Mail-ID des Autors ändern können. Schauen Sie sich die folgenden Screenshots an:

enter image description here

enter image description here

66
atulkhatri

Einige meiner Erfahrungen mit der Konvertierung von Mercurial nach Git.

1. hg-fast-export

Die Verwendung von hg-fast-export schlug fehl und ich benötigte --force wie oben angegeben. Als nächstes habe ich diesen Fehler bekommen:

fehler: Ref 'refs/heads/stable' kann nicht gesperrt werden: 'refs/heads/stable/sub-branch-name' existiert; kann nicht 'refs/heads/stable' erstellen

Nach Abschluss des HG-Fast-Exports erhielt ich ein amputiertes Repo. Ich denke, dass dieses Repo einige verwaiste Zweige hatte und dass hg-fast-export ein etwas idealisiertes Repo benötigt. Das alles schien ein bisschen rau an den Rändern, also bin ich zu Kiln Harmony übergegangen ( http://blog.fogcreek.com/announcing-kiln-harmony-the-future-of-dvcs/ )

2. Ofen

Kiln Harmony scheint nicht auf einem kostenlosen Konto zu existieren, wie oben vorgeschlagen. Ich könnte zwischen nur Git und nur Mercurial Repos wählen und es gibt keine Möglichkeit zu wechseln. Ich habe ein Support-Ticket erstellt und werde das Ergebnis mitteilen, wenn sie antworten.

3. hg-git

Das Hg-Git Mercurial-Plugin ( http://hg-git.github.io/ ) hat bei mir funktioniert. FYI unter Mac OS X habe ich hg-git wie folgt über Macports installiert:

  • Sudo-Port installieren python27
  • Sudo port select --set python python27
  • Sudo-Port installieren py27-hggit
  • vi ~/.hgrc

.hgrc benötigt diese Zeilen:

[ui]
username = Name Surname <[email protected]>

[extensions]
hgext.bookmarks =
hggit = 

Ich hatte dann Erfolg mit:

hg Push git+ssh://[email protected]:myaccount/myrepo.git

4. Einschränkung: Kennen Sie Ihr Repo

Alle oben genannten Instrumente sind stumpfe Instrumente, und ich habe mich nur durchgesetzt, weil es genug Zeit gekostet hat, das Team dazu zu bringen, Git richtig einzusetzen.

Beim ersten Drücken des Projekts gemäß (3) fehlten alle neuen Änderungen. Dies liegt daran, dass diese Codezeile nur als Richtlinie angesehen werden darf:

$ hg bookmark -r default master # make a bookmark of master for default, so a ref gets created

Die Theorie besagt, dass der Standardzweig als Master angesehen werden kann, wenn auf Git zugegriffen wird, und in meinem Fall habe ich ein Repo geerbt, bei dem "stable" als Entsprechung von master verwendet wurde. Außerdem stellte ich fest, dass die Spitze des Repos ein Hotfix war, der noch nicht mit dem 'stabilen' Zweig zusammengeführt wurde.

Wenn Sie Mercurial und das zu konvertierende Repo nicht richtig verstehen, ist es wahrscheinlich besser, die Konvertierung nicht durchzuführen.

Ich habe Folgendes getan, um das Repo für einen zweiten Konvertierungsversuch vorzubereiten:

hg update -C stable
hg merge stable/hotfix-feature
hg ci -m "Merge with stable branch"
hg Push git+ssh://[email protected]:myaccount/myrepo.git

Danach hatte ich ein nachweislich gleichwertiges Projekt in Git, aber alle verwaisten Zweige, die ich zuvor erwähnt habe, sind verschwunden. Ich denke nicht, dass das zu ernst ist, aber ich kann es gut leben, dies als Versehen zu bedauern. Daher ist mein letzter Gedanke, das Original trotzdem zu behalten.

Bearbeiten: Wenn Sie nur das neueste Festschreiben in Git wünschen, ist dies einfacher als das obige Zusammenführen:

hg book -r tip master
hg Push git+ssh://[email protected]:myaccount/myrepo.git
17
Dion Truter

Ich hatte eine ähnliche Aufgabe zu erledigen, die jedoch einige Aspekte enthielt, die von den anderen Antworten hier nicht ausreichend abgedeckt wurden:

  • Ich wollte alle (in meinem Fall: zwei oder allgemein: mehr als eine) Zweige meines Repos konvertieren.
  • Ich hatte in meinen Commit-Nachrichten und Dateinamen Nicht-ASCII- und (als Windows-Benutzer) Nicht-UTF8-codierte Zeichen (für Neugierige: Deutsches Umlaut).

Ich habe nicht fast-export und hg-fast-export ausprobiert, da diese voraussetzen, dass Sie Python und einige Mercurial Python Module auf Ihrem Rechner haben, die ich hatte nicht.

Ich habe hg-init mit TortoiseHG ausprobiert und diese Antwort gab mir einen guten Start. Es sah jedoch so aus, als würde nur der aktuelle Zweig konvertiert, nicht alle auf einmal (*). Also habe ich die hg-init docs und diesen Blog-Beitrag gelesen und hinzugefügt

[git]  
branch_bookmark_suffix=_bookmark

zu meiner Mercurial.ini und tat

hg bookmarks -r default master  
hg bookmarks -r my_branch my_branch_bookmark  
hg gexport

(Wiederholen Sie die zweite Zeile für jeden Zweig, den Sie konvertieren möchten, und wiederholen Sie sie erneut, falls Sie vor der Ausführung der dritten Zeile ein weiteres Commit ausführen möchten.) Dies erstellt einen Ordner git innerhalb von .hg, was sich als reines Git-Repo mit allen exportierten Zweigen herausstellt. Ich konnte dieses Repo klonen und hatte eine Arbeitskopie wie gewünscht.

Oder fast ...

Laufen

git status

in meiner Arbeitskopie wurden alle Dateien mit Nicht-ASCII-Zeichen im Namen als nicht verfolgte Dateien angezeigt. Also recherchierte ich weiter und folgte diesem Ratschlag :

git rm -rf --cached \*  
git add --all
git commit 

Und endlich war das Repo fertig, um zu Bitbucket hochgeschoben zu werden :-)

Ich habe auch den Github-Importer ausprobiert, wie in diese Antwort . Ich habe Bitbucket als Quellsystem verwendet, und Github hat ziemlich gute Arbeit geleistet, d. H., Es hat alle Zweige automatisch konvertiert. Es wurden jedoch '?' - Zeichen für alle Nicht-ASCII-Zeichen in meinen Commit-Nachrichten (Web-UI und lokal) und Dateinamen (nur Web-UI) angezeigt, und obwohl ich die Dateinamen wie oben beschrieben reparieren konnte, hatte ich keine Ahnung Was ist mit den Commit-Nachrichten zu tun? Daher würde ich den Ansatz hg-init bevorzugen. Ohne das Codierungsproblem wäre der Github-Importer eine perfekte und schnelle Lösung gewesen (solange Sie ein bezahltes Github-Konto haben oder tolerieren, dass Ihr Repo öffentlich ist, solange es von Github auf Ihren lokalen Computer gezogen wird).


(*) Also sah es wie aus, bevor ich entdeckte, dass ich alle Zweige, die ich exportieren möchte, mit einem Lesezeichen versehen muss. Wenn Sie und Push zu einem nackten (!) Repo, wie die verknüpfte Antwort sagt, erhalten Sie alle Zweige.

8
Matthias

Eine andere Möglichkeit ist, ein kostenloses Kiln-Konto zu erstellen - Brennofen-Roundtrips zwischen git und hg mit 100% Metadatenaufbewahrung, sodass Sie es für eine einmalige Konvertierung verwenden oder mit einem beliebigen Client auf ein Repository zugreifen können.

8
Ry4an Brase

Von:

http://hivelogic.com/articles/converting-from-Mercurial-to-git

Migration

Es ist ein relativ einfacher Prozess. Zuerst laden wir den schnellen Export herunter (der beste Weg ist über das Git-Repository, das ich direkt auf den Desktop klone), dann erstellen wir ein neues Git-Repository, führen die Migration durch und checken den HEAD aus. Auf der Kommandozeile geht es so:

cd ~/Desktop
git clone git://repo.or.cz/fast-export.git
git init git_repo
cd git_repo
~/Desktop/fast-export/hg-fast-export.sh -r /path/to/old/Mercurial_repo
git checkout HEAD

Es sollte eine lange Liste von Commits angezeigt werden, während Ihr Projekt nach dem Ausführen des schnellen Exports migriert wird. Wenn Sie Fehler sehen, sind diese wahrscheinlich auf einen falsch angegebenen Python Pfad zurückzuführen (siehe Hinweis oben und passen Sie ihn an Ihr System an).

Das war's, du bist fertig.

8
Reck Hou

Das wäre besser als Kommentar, sorry, ich habe keine Kommentarberechtigungen.

@ mar10 Kommentar war das fehlende Stück, das ich brauchte, um dies zu tun.

Beachten Sie, dass '/ path/to/old/Mercurial_repo' ein Pfad im Dateisystem sein muss (keine URL), daher müssen Sie vorher das ursprüngliche Repository klonen. - 27. Dezember 13 um 16:30 Uhr

Dieser Kommentar bezog sich auf die Antwort, die dies für mich gelöst hat. https://stackoverflow.com/a/10710294/2148757 Dies ist die gleiche Antwort wie die hier als richtig gekennzeichnete. https://stackoverflow.com/a/16037861/2148757

Dies hat unser hg-Projekt dazu bewegt, die Commit-Historie intakt zu halten.

2
Sashah