Ich benutze GIT auf einem Mac. Genug gesagt. Ich habe die Werkzeuge, ich habe die Erfahrung. Und ich möchte es weiterhin verwenden. Keine Kriege hier ...
Das Problem liegt immer in der Interoperabilität. Die meisten Leute benutzen SVN, was für mich großartig ist. Git SVN funktioniert sofort und ist eine schnörkellose Lösung. Die Leute können SVN weiterhin gerne nutzen und ich verliere weder meinen Workflow noch meine Tools.
Nun ... Einige Leute kommen mit Mercurial. Gut für sie: Sie haben ihre Gründe. Aber ich kann kein sofort einsatzbereites GIT HG finden. Ich möchte nicht zu HG wechseln, muss aber trotzdem mit ihrem Repository zusammenarbeiten.
Kennt jemand von euch eine einfache Lösung dafür?
Antworten:
Update vom Juni 2012. Derzeit scheint es die folgenden Methoden für die Git / Hg-Interoperabilität zu geben, wenn der Entwickler von der Git-Seite aus arbeiten möchte:
Installieren Sie Mercurial und die hg-git-Erweiterung . Letzteres können Sie mit Ihrem Paketmanager oder mit tun
easy_install hg-git
. Stellen Sie dann sicher, dass Folgendes in Ihrem ~ / .hgrc enthalten ist:Möglicherweise sehen Sie auch hier einige Referenzen, in denen es um die Angabe der
bookmarks
Erweiterung geht, die jedoch seit Version 1.8 in Mercurial integriert sind. Hier sind einige Tipps zur Installation von hg-git unter Windows .Sobald Sie hg-git haben, können Sie Befehle ungefähr wie oben beschrieben von Abderrahim Kitouni verwenden . Diese Methode wurde jedoch seit 2009 verfeinert und optimiert , und es gibt einen freundlichen Wrapper: git-hg-again . Dies verwendet das Toplevel-Verzeichnis gleichzeitig als Arbeitsverzeichnis für Mercurial und Git. Es erstellt ein Mercurial-Lesezeichen, das mit der Spitze des
default
(unbenannten) Zweigs im Mercurial-Repository synchronisiert ist , und aktualisiert einen lokalen Git-Zweig von diesem Lesezeichen.git-remote-hg ist ein anderer Wrapper, der ebenfalls auf der Mercurial-
hg-git
Erweiterungbasiert. Dies nutzt zusätzlich diegit-remote-helpers
Protokolle (daher der Name). Das Verzeichnis der obersten Ebene wird nur für ein Git-Arbeitsverzeichnis verwendet. Es hält sein Mercurial-Repository frei. Es unterhält auch ein zweites nacktes Git-Repository, um die Synchronisierung zwischen Git und Mercurial sicherer und idiomatischer zu machen.Das git-hg- Skript (früher hier gepflegt ) verwendet eine andere Methode als
hg-fast-export
das Fast-Export-Projekt . Wie bei Methode 2 werden auch hier ein nacktes Mercurial-Repository und ein zusätzliches nacktes Git-Repository beibehalten.Beim Ziehen ignoriert dieses Tool Mercurial-Lesezeichen und importiert stattdessen jeden benannten Mercurial-Zweig in einen Git-Zweig und den standardmäßigen (unbenannten) Mercurial-Zweig in den Master.
In einigen Kommentaren wird dieses Tool als nur hg-> git beschrieben, es wird jedoch behauptet, am 7. Dezember 2011 in git-> hg push support integriert worden zu sein einer Überprüfung dieser Tools , versucht dieses Tool jedoch zu implementieren Push-Unterstützung scheint nicht praktikabel zu sein.
Es gibt auch anderes Projekt namens git-remote-hg . Im Gegensatz zu der oben aufgeführten Version basiert diese nicht auf hg-git, sondern greift direkt auf die Mercurial Python-API zu. Zur Verwendung ist derzeit auch eine gepatchte Version von git erforderlich. Ich habe das noch nicht ausprobiert.
Endlich Schneider ein Projekt, das schrittweise zwischen verschiedenen VCS konvertiert. Es hört sich so an, als würde die Entwicklung nicht aggressiv fortgesetzt.
Die ersten drei dieser Ansätze sahen leicht genug aus, um mich zu einer Untersuchung zu bewegen. Ich musste sie auf einige Arten optimieren, damit sie in meinem Setup ausgeführt werden, und ich sah einige Möglichkeiten, sie weiter zu optimieren, um sie zu verbessern, und dann habe ich sie noch weiter optimiert, damit sie sich ähnlicher verhalten, damit ich sie bewerten kann sie effektiver. Dann dachte ich, andere möchten vielleicht auch diese Verbesserungen vornehmen, um die gleiche Bewertung vorzunehmen. Deshalb habe ich ein Quellpaket erstellt , mit dem Sie meine Versionen der ersten drei Tools installieren können. Es sollte sich auch um die Installation der benötigten
hg-fast-export
Teile kümmern . (Sie müssen selbst installierenhg-git
.)Ich ermutige Sie, sie auszuprobieren und selbst zu entscheiden, was am besten funktioniert. Ich freue mich über Fälle, in denen diese Werkzeuge kaputt gehen. Ich werde versuchen, sie mit vorgelagerten Änderungen synchron zu halten und sicherzustellen, dass die vorgelagerten Autoren über die Verbesserungen informiert sind, die ich für nützlich halte.
Wie oben erwähnt, bin ich bei der Bewertung dieser Tools zu dem Schluss gekommen, dass
git-hg
nur zum Ziehen aus Mercurial und nicht zum Schieben verwendet werden kann.In diesem Zusammenhang finden Sie einige nützliche Vergleiche / Übersetzungshandbücher zwischen Git und Mercurial, die sich in einigen Fällen an Benutzer richten, die Git bereits kennen:
quelle
Es gibt eine neue git-remote-hg, die native Unterstützung bietet:
Bridge-Unterstützung in Git für Mercurial und Bazaar
Kopieren Sie einfach git-remote-hg in Ihren $ PATH, machen Sie es ausführbar und fertig, keine Abhängigkeiten (außer Mercurial):
Sie sollten in der Lage sein, darauf zu schieben und zu ziehen, als wäre es ein natives Git-Repository.
Wenn Sie neue Git-Zweige verschieben, werden Mercurial-Lesezeichen für diese erstellt.
Weitere Informationen finden Sie im git-remote-hg-Wiki .
quelle
git-remote-hg
(dh kein.py
Suffix).#!/usr/bin/env python2
.Sie sollten in der Lage sein, hg-git zu verwenden .
bearbeiten
~/.hgrc
und hinzufügen:Erstellen Sie ein Lesezeichen, damit Sie ein
master
In-Git haben:Bearbeiten Sie
.hg/hgrc
im Repository und fügen Sie hinzu:Jetzt können Sie das Git-Repository erstellen:
und Sie können das resultierende Verzeichnis als Git-Klon verwenden. Ziehen aus Quecksilber wäre:
und auf mercurial drängen:
(Ja, Sie müssen hg für diesen Workflow verwenden, aber Ihr Hacking wird alles in git sein)
PS Wenn Sie ein Problem mit diesem Workflow haben, melden Sie bitte einen Fehler.
quelle
git status
Befehl auszugeben: $ git status fatal: Dieser Vorgang muss in einem Arbeitsbaum ausgeführt werden. Dies geschieht, nachdem ich einenhg gexport
in einem frisch geklonten hg-Repository ausgegeben habe . Was ist eine mögliche Lösung, um nackte Repositories zu umgehen? Update . Anscheinend funktioniert Rock Burts Vorschlag. Vielen DankSie können versuchen
hg2git
, welches Python-Skript ist und Teil des Schnellexports ist, den Sie unter http://repo.or.cz/w/fast-export.git finden .Sie müssen jedoch mercurial installiert haben.
quelle
hg-fast-export
funktionierthg-fast-export
Skript an versendethg2git
. Ich habe aber nicht alles aufgespürt. Beachten Sie, dass diese Tools nur das Wechseln von Hg-> Git zulassen, nicht umgekehrt.Da es sich bei hg-git um eine Zwei- Wege-Brücke handelt, können Sie auch Änderungssätze von Git auf Mercurial übertragen.
quelle
Hg-Git Mercurial Plugin . Ich habe es nicht selbst ausprobiert, aber es könnte sich lohnen, es mir anzusehen.
quelle
Ich habe mit großem Erfolg hatte
git-hg
von https://github.com/cosmin/git-hg (erfordert den Arbeits installierenhg
, auch). Es unterstützt Fetch, Pull undPushund ist für mich stabiler alshg-git
(ähnliche Funktionen vonhg
bis Git).Anwendungsbeispiele finden Sie unter https://github.com/cosmin/git-hg#usage . Die Benutzeroberfläche ist sehr ähnlich
git-svn
.Dies
git-hg
erfordert zusätzlichen Speicherplatz für jedes geklonte hg-Repo. Die Implementierung verwendet einen vollständigen Quecksilberklon, einen zusätzlichen Git-Bare-Klon und das eigentliche Git-Repo. Der erforderliche Speicherplatz beträgt ungefähr das Dreifache der normalen Git-Only-Nutzung. Die zusätzlichen Kopien werden unter dem.git
Verzeichnis Ihres Arbeitsverzeichnisses (oder dem Speicherort, auf denGIT_DIR
wie gewohnt verwiesen wird ) gespeichert .Hinweis: Das grundlegende Problem,
git-hg
das zu lösen versucht, besteht darin, dass zwischengit
undhg
Features keine 1: 1-Zuordnung besteht. Das größte Problem ist die Impedanzfehlanpassung zwischen Git-Zweigen und hg-unbenannten Zweigen und hg-benannten Zweigen und hg-Lesezeichen (all diese sehen fürgit
Benutzer sehr nach Zweigen aus ). Ein damit verbundenes Problem besteht darin, dasshg
versucht wird, den ursprünglich benannten Zweignamen im Versionsverlauf zu speichern, im Gegensatz zu git, bei dem der Zweigname standardmäßig nur zur Vorlage-Commit-Nachricht hinzugefügt wird.Jedes Tool, das behauptet, eine interoperable Brücke zwischen diesen Impedanzanpassungen zu schaffen
git
undhg
zu erklären, wie es damit umgehen soll. Sie können dann entscheiden, ob die ausgewählte Lösung Ihren Anforderungen entspricht.Die Lösung
git-hg
besteht darin, alle hg-Lesezeichen zu verwerfen und benannte Zweige in Git-Zweige umzuwandeln. Außerdem wird der Git-Master-Zweig auf den unbenannten Standard-HG-Zweig gesetzt.quelle
git-hg
es nur zum Ziehen von Hg geeignet ist, nicht zum Drücken (siehe die Erklärung, auf die ich in meiner Antwort verweise). Haben Sie einen Weg gefunden, es erfolgreich in beide Richtungen einzusetzen? In Bezug auf zusätzlichen Speicherplatz umfassen alle Techniken, mit denen ich vertraut bin, das Arbeitsverzeichnis + eine Kopie von git db / metadata + eine Kopie von hg db / metadata. Das Hinzufügen einer zweiten Kopie der Git-Datenbank / Metadaten erfordert zwar mehr Festplattennutzung, aber vergleichsweise ist es nicht so schlimm, wie es scheint.git-hg
nicht zum Schieben geeignet ist. Ich habe meine Antwort geändert, um klarer zu machen, dass siepush
nicht stabil genug ist.Habe es versucht hggit. Funktioniert für mich, da ich die Arbeit von Gitern und Hängern bewältigen muss. Besonders für Bewertungen ist dies großartig.
Ein kleines Problem / eine Warnung zu diesem Thema:
Ich habe versucht, ein stabiles Linux-Kernel-Repository mit hg zu klonen. Diese Repositorys werden in git verwaltet und enthalten normalerweise eine große Anzahl von Dateien.
Es war sehr langsam. Ich habe 2 Tage gebraucht, um eine Arbeitskopie vollständig zu klonen und zu aktualisieren.
quelle
hggit
oderhg
zu langsam ist, um verwendet zu werden?Ich habe versucht , cosmin git-hg und abourget git-hg-wieder beide auf mutt hg Repo , so scheint es , dass die spätere Hinsicht der Ordnung einer Zusammenführung gut, die ehemaligen ein bisschen zufällig ist. Sie können aus den Screenshots unten sehen.
Ein Merge-Verlaufsdiagramm von Mutt, das von cosmins git-hg importiert wurde :
Ein Diagramm zum Zusammenführen von Kötern, das von abourgets git-hg-again importiert wurde :
Das tatsächliche Verlaufsdiagramm, das von hgk im hg-Repository von mutt aufgezeichnet wurde:
Wie Sie oben sehen können, liegt das zweite Diagramm von abourgets git-hg-again sehr nahe am ursprünglichen hgk-Diagramm und spiegelt tatsächlich den tatsächlichen Arbeitsablauf des Köter wider.
Ein Nachteil von git-hg-again, den ich gefunden habe, ist, dass es keine 'hg'-Fernbedienung hinzufügt, sondern alle seine Refs als lokale Tags importiert. Git-hg hat eine wunderbare' hg'-Fernbedienung, die das Upstream-hg-Repo darstellt.
quelle
gitk
zur Historienvisualisierung (z. B. ) sollte in der Lage sein, beide Historien identisch zu rendern. Das einzig offensichtlich fehlende ist der Zweighg/stable
in der Version von abourget. Ich denke, es ist die Sache zwischen benannten Zweigen, unbenannten Zweigen und Lesezeichen in Mercurial.Die bidirektionale Synchronisierung von hg-git (und git-git, hg-hg) ist auch mit dem Dienst Git-hg Mirror möglich . Es verwendet hg-git (unter anderem) hinter den Kulissen und sein Code ist auch Open Source.
Haftungsausschluss : Ich bin von der Firma dahinter.
quelle