Współdziałanie Git z repozytorium Mercurial


195

Używam GIT na Macu. Wystarczająco powiedziane. Mam narzędzia, mam doświadczenie. I chcę go nadal używać. Żadnych wojen tutaj ...

Problem zawsze dotyczy interoperacyjności. Większość ludzi używa SVN, co jest dla mnie świetne. Git SVN działa od razu po wyjęciu z pudełka i jest bezproblemowy. Ludzie mogą nadal szczęśliwie korzystać z SVN, a ja nie tracę przepływu pracy ani narzędzi.

Teraz ... Niektórzy faceci przychodzą razem z Mercurialem. Dobrze dla nich: mają swoje powody. Ale nie mogę znaleźć żadnego gotowego GIT HG. Nie chcę przejść na HG, ale nadal muszę współpracować z ich repozytorium.

Czy ktoś z was zna proste rozwiązanie?


4
hg-git działa w obu kierunkach.
Derek Mahar,

1
Odpowiedź @dubiousjim jest bardziej przydatna, wszechstronna i bardziej aktualna niż obecne dwie najlepsze, które wskazują na niezachowane repozytorium lub udzielają przestarzałych porad. Ale jeszcze więcej aktualizacji tego pytania byłoby bardzo pomocne.
nealmcb

Odpowiedzi:


60

Aktualizacja od czerwca 2012. Obecnie wydaje się, że istnieją następujące metody interoperacyjności Git / Hg, gdy programista chce pracować ze strony git:

  1. Zainstaluj Mercurial i rozszerzenie hg-git . Możesz zrobić to drugie za pomocą menedżera pakietów lub za pomocą easy_install hg-git. Następnie upewnij się, że w twoim ~ / .hgrc znajduje się:

    [extensions]
    hggit = 
    

    Możesz zobaczyć tutaj odniesienia, które mówią o określaniu bookmarksrozszerzenia, ale jest ono wbudowane w Mercurial od wersji 1.8. Oto kilka wskazówek dotyczących instalowania hg-git w systemie Windows .

    Gdy masz już hg-git, możesz używać poleceń mniej więcej takich jak Abderrahim Kitouni powyżej . Ta metoda została jednak udoskonalona i ulepszona od 2009 roku. Istnieje również przyjazne opakowanie: git-hg-again . Wykorzystuje katalog najwyższego poziomu jako katalog roboczy jednocześnie dla Mercurial i Git. Tworzy zakładkę Mercurial, która jest zsynchronizowana z końcem default(nienazwanej) gałęzi w repozytorium Mercurial i aktualizuje lokalny oddział Git z tej zakładki.

  2. git-remote-hg to inne opakowanie, również oparte nahg-gitrozszerzeniuMercurial. To dodatkowo wykorzystujegit-remote-helpersprotokoły (stąd jego nazwa). Używa katalogu najwyższego poziomu tylko dla katalogu roboczego Git; utrzymuje swoje repozytorium Mercurial puste. Utrzymuje również drugie puste repozytorium Git, aby synchronizacja między Git i Mercurial była bezpieczniejsza i bardziej idiomatycznie podobna do git.

  3. Git-hg skrypt (dawniej utrzymane tutaj ) wykorzystuje inną metodę, opartą na hg-fast-exportod projektu fast-eksportowej . Podobnie jak w przypadku metody 2, zachowuje to również puste repozytorium Mercurial i dodatkowe puste repozytorium Git.

    Podczas przeciągania narzędzie to ignoruje zakładki Mercurial i zamiast tego importuje każdą nazwaną gałąź Mercurial do gałęzi Git, a domyślną (nienazwaną) gałąź Mercurial do master.

    Niektóre komentarze omawiają to narzędzie jako tylko hg-> git, ale twierdzi, że połączyło się z obsługą git-> hg push w dniu 7 grudnia 2011 r. Jednak, jak wyjaśniam w przeglądzie tych narzędzi , sposób, w jaki to narzędzie próbuje zaimplementować wsparcie push nie wydaje się realne.

  4. Istnieje również inny projekt o nazwie git-remote-hg . W przeciwieństwie do wersji wymienionej powyżej, ta nie opiera się na hg-git, ale zamiast tego uzyskuje bezpośredni dostęp do interfejsu API Mercurial Python. W tej chwili korzystanie z niego wymaga również poprawionej wersji git. Jeszcze tego nie próbowałem.

  5. Wreszcie, Tailor to projekt, który stopniowo konwertuje między różnymi różnymi VCS. Wygląda na to, że rozwój tego nie będzie agresywnie kontynuowany.

Pierwsze trzy z tych podejść wyglądały na wystarczająco lekkie, aby przekonać mnie do zbadania. Musiałem je ulepszyć na kilka sposobów, aby działały w mojej konfiguracji, i widziałem kilka sposobów, aby ulepszyć je dalej, aby je ulepszyć, a następnie ulepszyłem je jeszcze bardziej, aby zachowywały się bardziej do siebie, aby móc ocenić bardziej efektywnie. Potem pomyślałem, że inni też mogą chcieć wprowadzić te poprawki, aby dokonać tej samej oceny. Więc ja się pakiet źródłowy , który pozwoli Ci zainstalować moje wersje każdy z pierwszych trzech narzędzi. Powinien również zadbać o zainstalowanie potrzebnych hg-fast-exportelementów. (Musisz zainstalować hg-gitsam.)

Zachęcam do wypróbowania ich i sam zdecyduj, co działa najlepiej. Z przyjemnością dowiem się o przypadkach uszkodzenia tych narzędzi. Spróbuję je zsynchronizować ze zmianami w górę i upewnić się, że autorzy w górę są świadomi poprawek, które moim zdaniem są przydatne.

Jak wspomniałem powyżej, oceniając te narzędzia, doszedłem do wniosku, że git-hgjest on użyteczny tylko do pobierania z Mercurial, a nie do pchania.

Podobnie, oto kilka przydatnych porównań / instrukcji tłumaczeń między Git i Mercurial, w niektórych przypadkach skierowanych do użytkowników, którzy już znają Git:


2
Sam używam metody nr 2, a raczej mojej ulepszonej wersji. Ogólnie rzecz biorąc, wydaje mi się to najbardziej niezawodnym i elastycznym podejściem (spośród tych, których próbowałem). Szczegółowe informacje można znaleźć w linkach do mojej recenzji / pakietu źródłowego.
dubiousjim

Tak. Harmonia pieca jest niesamowita. Bezpłatnie również dla twórców solo.
CAD bloke

114

Istnieje nowa git-remote-hg, która zapewnia natywne wsparcie:

Obsługa mostków w Git dla Mercurial i Bazaar

Po prostu skopiuj git-remote-hg do $ PATH, uczyń go wykonywalnym i to wszystko, bez zależności (innych niż Mercurial):

git clone hg::https://www.mercurial-scm.org/repo/hg/

Powinieneś być w stanie pchać i wyciągać z niego, jakby to było rodzime repozytorium Git.

Po przesunięciu nowych gałęzi Git zostaną utworzone dla nich zakładki Mercurial.

Aby uzyskać więcej informacji, zobacz wiki git-remote-hg .


14
Hej, Felipe, to nie do końca prawda, potrzebujesz działającej wersji rtęci jako zależności
Antoine Pelisse

5
Upewnij się, że nazwałeś go dokładnie git-remote-hg(tzn. Bez .pyprzyrostka).
schmmd

3
Działa, gdy repozytorium hg również jest submodułem.
Clayton Stanley

4
Zauważ, że potrzebujesz Pythona 2. Jeśli więc Python 3 jest domyślny w twoim systemie (lub jeśli nie uruchamiasz Debiana i chcesz być w przyszłości), zmień pierwszą linię na #!/usr/bin/env python2.
Kevin Cox,

4
Zauważ, że ponieważ gur-remote-hg Mercurial 3.2 @FelipeC już nie działa ( github.com/felipec/git-remote-hg/issues/27 ), to znaczy, dopóki widelec, który rozwiązuje problem, nie zostanie scalony (patrz github .pl / fingolfin / git-remote-hg )
Cimbali,

106

Powinieneś być w stanie używać hg-git .

hg clone <hg repository>

edytuj ~/.hgrci dodaj:

[extensions]
hgext.bookmarks =
hggit =

utwórz zakładkę, aby uzyskać master:

cd <repository>
hg bookmark -r default master

edytuj .hg/hgrcw repozytorium i dodaj:

[git]
intree = true

teraz możesz utworzyć repozytorium git:

hg gexport

i możesz użyć wynikowego katalogu jako klon git. wyciągnięcie z rtęci byłoby:

hg pull
hg gexport

i pchanie do rtęci:

hg gimport
hg push

(Tak, musisz użyć hg z tym przepływem pracy, ale twoje hakowanie będzie w całości git)

PS Jeśli masz problem z tym przepływem pracy, zgłoś błąd.


3
nie zapomnij najpierw uruchomić easy_install hg-git
Christian Oudard

1
Nie do końca to, czego chciałem, ale wciąż wykonalne. Dzięki.
Hugo Sereno Ferreira,

3
Tylko fyi, po uruchomieniu tego procesu raz na lokalnym repozytorium hg (i zrobieniu czegoś złego) nie byłem w stanie sklonować wynikowego repo przy użyciu git. Musiałem „klonować hg” źródłowe repozytorium hg, postępować zgodnie z instrukcjami na nowym repozytorium hg, a następnie sklonować nowe repozytorium hg.
Rocky Burt,

1
Rozumiem to, gdy próbuję wydać git statuspolecenie $ git status fatal: Ta operacja musi zostać uruchomiona w drzewie roboczym To jest po tym, jak wydałem hg gexportw świeżo sklonowanym repozytorium hg. W jaki sposób można obejść nagie repozytoria? Aktualizacja . Najwyraźniej sugestia Rocka Burta działa. Dziękuję
tak,

1
@ThaDon Mam ten sam problem. Najwyraźniej repozytorium git jest tworzone jako .hg / git. Rozwiązaniem jest „ln -s .hg / git .git”.
mb14,

15

Możesz spróbować hg2git, który jest skryptem w języku Python i jest częścią szybkiego eksportu, który można znaleźć na stronie http://repo.or.cz/w/fast-export.git .

Musisz jednak mieć zainstalowany program Mercurial.


4
To przekształciło repozytorium hg w repozytorium git, dziękuję bardzo!
Rebbot

Ten skrypt dla mnie nie powiódł się, ale oryginał hg-fast-exportdziałał dobrze
Andrei

Myślę, że obecnie hg-fast-exportskrypt jest wysyłany do hg2git. Jednak nie prześledziłem tego wszystkiego. Zauważ, że te narzędzia pozwalają tylko na przejście z Hg-> Git, a nie odwrotnie.
dubiousjim

9

Ponieważ hg-git jest mostem dwukierunkowym , pozwoli ci również przesuwać zestawy zmian z Git na Mercurial.


6

Hg-Git Mercurial Plugin . Sam tego nie próbowałem, ale warto sprawdzić.


7
Jest to wtyczka, która pozwala użytkownikom rtęci wypychać i wyciągać z repozytoriów git, a nie na odwrót, czego chce OP.
sykora

1
@sykora, można go również wykorzystać do zwiększenia interoperacyjności z odwrotnego kierunku. Zobacz niektóre z narzędzi wymienionych w mojej odpowiedzi.
dubiousjim

6

Miałem wielki sukces git-hgz https://github.com/cosmin/git-hg (wymaga działa instalacja hg, zbyt). Obsługuje pobieranie, ciągnięcie i wypychanie i jest dla mnie bardziej stabilny niż hg-git(podobne funkcje zhg do git).

Zobacz https://github.com/cosmin/git-hg#usage przykłady użycia. Interfejs użytkownika jest bardzo podobny do git-svn.

git-hgWymaga dodatkowej przestrzeni dyskowej dla każdego sklonowanego hg repo. Implementacja wykorzystuje pełny klon rtęciowy, dodatkowy klon git gon i faktyczne repozytorium git. Wymagane miejsce na dysku jest około 3 razy większe niż normalne użycie samego gita. Dodatkowe kopie są przechowywane poniżej .gitkatalogu katalogu roboczego (lub lokalizacji wskazanej GIT_DIRjak zwykle).

Wskazówka: Podstawowym problemem, który git-hgpróbuje rozwiązać to, że nie ma to 1: 1 mapowanie między giti hgfunkcje. Największym problemem jest niedopasowanie impedancji między gałęziami git i gałęziami hg bez nazw oraz gałęziami hg nazwanymi i zakładkami hg (wszystkie te wyglądają bardzo podobnie do gałęzi dla gitużytkowników). Powiązany problem polega na tym hg, że próbuje zapisać oryginalną nazwę gałęzi w historii wersji, w przeciwieństwie do git, gdzie nazwa gałęzi jest domyślnie dodawana tylko do szablonu zatwierdzenia.

Każde narzędzie, które twierdzi, że tworzy mostek interoperacyjny giti hgpowinno wyjaśniać, jak sobie poradzi z tym dopasowaniem impedancji.Następnie możesz zdecydować, czy wybrane rozwiązanie odpowiada Twoim potrzebom.

Rozwiązaniem, które git-hgwykorzystuje jest odrzucanie wszystkich zakładek hg i konwertowanie nazwanych gałęzi na gałęzie git. Ponadto ustawia gałąź master git na domyślną gałąź bez nazwy hg.


Wygląda na to, że git-hgjest to opłacalne tylko do ściągania z Hg, a nie do pchania (patrz wyjaśnienie, do którego linkuję w mojej odpowiedzi). Czy udało Ci się znaleźć sposób na skuteczne wykorzystanie go w obu kierunkach? Jeśli chodzi o dodatkową przestrzeń, wszystkie techniki, które znam, obejmują pracę w katalogu + jedna kopia git db / metadanych + jedna kopia hg db / metadanych. Dodanie drugiej kopii git db / metadanych wiąże się z większym wykorzystaniem dysku, tak, ale w porównaniu z tym nie jest tak złe, jak mogłoby się wydawać.
dubiousjim

@dubiousjim Moje potrzeby zostały zaspokojone działającym ściąganiem / pobieraniem i nigdy tak naprawdę nie testowałem wypychania. Ufałem dokumentacji, ale po sprawdzeniu twoich wyjaśnień uważam, że git-hgnie nadaje się to do popychania. Zmodyfikowałem swoją odpowiedź, aby wyjaśnić, że pushnie jest wystarczająco stabilna.
Mikko Rantalainen,

Szkoda, pomyślałem, że może istnieć sposób skutecznego użycia push, którego nie widziałem.
dubiousjim

1
+1 za podkreślenie niedopasowania impedancji i czego szukać
Matt Wilkie

3

Próbowałem hggit. Działa dla mnie, ponieważ muszę sobie poradzić z pracą git'erów i hg'erów. Jest to szczególnie przydatne w przypadku recenzji.

Drobna kwestia / ostrzeżenie na ten temat:

Próbowałem sklonować stabilne repozytorium jądra systemu Linux za pomocą hg. Te repozytoria są przechowywane w git i zwykle zawierają dużą liczbę plików.

To było bardzo wolne. Zajęło mi 2 dni, aby w pełni sklonować i zaktualizować kopię roboczą.


Wygląda na to, że jest coraz lepiej --- moja kasa trwa około sześciu godzin i twierdzi, że pozostało jeszcze tylko dziewięć ...
David Given

Cofam tamto. Działa już od około 25 godzin i nadal twierdzi, że zostało jeszcze tylko dziewięć. Dwa dni, powiedziałeś?
David Biorąc pod uwagę

1
Doświadczyłem tego - moja pierwsza próba w ogóle nie zadziałała - zakładam, że to był jakiś błąd, ale nigdy nie analizowałem tego dalej, przy drugiej próbie - przy zaktualizowanym hg-git ukończenie prawie 50 godzin zajęło mi na MacBooku Pro (2,66 GHz, 8 Gig RAM)
Wizz

39 godzin, więc pozostało tylko 11! Czterordzeniowy procesor AMD Phenom. To jest poczynienie postępów, dlatego jestem pozwalając go uruchomić (HG przedłużenie pasek postępu to trzeba mieć). Przełącza się między ustalaniem jednego procesora, bezużywaniem procesora i uzyskiwaniem dużego dostępu do dysku.
David Biorąc pod uwagę

Czy ktoś sprawdził, czy niska wydajność spowodowana przez hggitlub jest hgzbyt wolna, aby można go było zastosować w projektach wielkości jądra?
Mikko Rantalainen,

1

Próbowałem cosmin jest git-Hg i abourget na git-HG-znowu zarówno na Mutt za hg repo , wydaje się, że późniejsze szanuje rzędu scalenia dobrze, były to nieco przypadkowe. Możesz zobaczyć z poniższych zrzutów ekranu.

Wykres historii scalania mutta importowanego przez git-hg cosmina :

wprowadź opis zdjęcia tutaj

Wykres historii scalania mutta importowanego przez git-hg-znowu abourget :

wprowadź opis zdjęcia tutaj

Wykres historii aktualnych wykreślony przez hgk w repozytorium hg mutta:

wprowadź opis zdjęcia tutaj

Jak widać z powyższego, drugi wykres git-hg-abourget ponownie jest bardzo zbliżony do oryginalnego wykresu hgk i faktycznie odzwierciedla prawdziwy przebieg pracy kundla.

Jedną wadą git-hg-ponownie, którą znalazłem, jest to, że nie dodaje on pilota „hg”, a raczej importuje wszystkie referencje jako tagi lokalne, git-hg ma wspaniały pilot „hg” reprezentujący repozytorium hg w górę.


1
Wydaje mi się, że różnice między wersjami cosmin i abourget są uporządkowane przez rodziców w zatwierdzeniach scalania. Dobre narzędzie do wizualizacji historii (np. gitk) Powinno być w stanie identycznie renderować obie historie. Jedyne, czego oczywiście brakuje, to gałąź hg/stablew wersji abourget. Wydaje mi się, że jest to sprawa między nazwanymi gałęziami, nienazwanymi gałęziami i zakładkami w Mercurial.
Mikko Rantalainen

0

Dwukierunkowa synchronizacja hg-git (i git-git, hg-hg) jest również możliwa dzięki usłudze Mirror Git-hg . Używa hg-git (między innymi) za kulisami, a jego kod jest również open source.


Oświadczenie : Jestem z firmy stojącej za tym.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.