Mercurial Veri Havuzu ile Git birlikte çalışabilirliği


195

Mac'te GIT kullanıyorum. Yeterince söylendi. Araçlara sahibim, deneyime sahibim. Ve kullanmaya devam etmek istiyorum. Burada savaş yok ...

Sorun her zaman birlikte çalışabilirliktir. Çoğu insan benim için harika olan SVN kullanıyor. Git SVN kutudan çıkar ve fırfırsız bir çözüm değildir. İnsanlar SVN'yi mutlu bir şekilde kullanmaya devam edebilirler ve iş akışımı ve hiçbir aracımı kaybetmiyorum.

Şimdi ... Bazı çocuklar Mercurial ile birlikte geliyor. Onlar için iyi: nedenleri var. Ama kutudan çıkmış bir GIT HG bulamıyorum. HG'ye geçmek istemiyorum, ancak yine de depolarıyla birlikte çalışmam gerekiyor.

Herhangi biriniz bunun için basit bir çözüm biliyor musunuz?


4
hg-git her iki yönde de çalışır.
Derek Mahar

1
@Dubiousjim tarafından verilen cevap, bakıma muhtaç depolara işaret eden veya güncel olmayan tavsiyelerde bulunan mevcut ilk ikisinden daha yararlı, kapsamlı ve daha günceldir. Ancak bu soruya ilişkin daha fazla güncelleme çok yardımcı olacaktır.
nealmcb

Yanıtlar:


60

Şu anda geliştirici git tarafından çalışmak istediğinde Git / Hg birlikte çalışabilirliği için aşağıdaki yöntemler var gibi görünüyor:

  1. Mercurial ve hg-git uzantısını yükleyin . İkincisini paket yöneticinizi kullanarak veya ile yapabilirsiniz easy_install hg-git. Ardından aşağıdakilerin ~ / .hgrc dosyanızda olduğundan emin olun:

    [extensions]
    hggit = 
    

    bookmarksBurada da uzantıyı belirtmekten bahseden bazı referanslar görebilirsiniz , ancak bu sürüm 1.8'den beri Mercurial'a yerleştirildi. İşte Windows üzerinde hg-git yüklenmesiyle ilgili bazı ipuçları .

    Hg- git'e sahip olduğunuzda, yukarıda yayınlanan Abderrahim Kitouni gibi komutları kullanabilirsiniz . Bu yöntem 2009'dan beri rafine edildi ve ayarlandı ve dostça bir sarıcı var: git-hg-again . Bu, üst düzey dizini aynı anda hem Mercurial hem de Git için bir çalışma dizini olarak kullanır. defaultMercurial deposundaki (adsız) dalın ucu ile eşzamanlı tuttuğu bir Mercurial yer işareti oluşturur ve bu yer işaretinden yerel bir Git dalını güncelleştirir.

  2. git-remote-hg , Mercurialhg-gituzantısınadayanan farklı bir pakettir. Bu ayrıcagit-remote-helpersprotokolleri kullanır (dolayısıyla adı). En üst düzey dizini yalnızca Git çalışma dizini için kullanır; Mercurial deposunu çıplak tutar. Ayrıca Git ve Mercurial arasında daha güvenli ve daha deyimsel olarak gitlik yapmak için ikinci bir çıplak Git deposunu korur.

  3. Git-hg komut (eski tutulan burada ) dayalı farklı bir yöntem kullanır hg-fast-exportgelen hızlı ihracat projesi . Yöntem 2'de olduğu gibi, bu da çıplak bir Mercurial deposunu ve ek bir çıplak Git deposunu tutar.

    Çekmek için, bu araç Mercurial yer işaretlerini yok sayar ve bunun yerine her Mercurial dalını Git dalına ve varsayılan (adsız) Mercurial dalını master'a alır.

    Bazı tefsir> git sadece ama ben açıklamak üzere Aralık 2011'de 7 git-> hg itme destek birleşti iddia hg- olarak bu aracı anlatılır bu araçların gözden arada olsa bu araç çalışır uygulamak push desteği uygulanabilir görünmüyor.

  4. Git-remote-hg adında başka bir proje daha var . Yukarıda listelenen sürümden farklı olarak, bu hg-git'e güvenmez, bunun yerine doğrudan Mercurial Python API'sine erişir. Şu anda, onu kullanmak için git'in yamalı bir sürümünü gerektirir. Henüz denemedim.

  5. Son olarak, Tailor , çeşitli VCS'ler arasında kademeli olarak dönüşüm sağlayan bir projedir. Bunun gelişimi agresif bir şekilde devam etmeyecek gibi görünüyor.

Bu yaklaşımların ilk üçü beni araştırmaya ikna edecek kadar hafif görünüyordu. Onları kurulumumda çalıştırmak için bazı şekillerde düzeltmem gerekiyordu ve onları iyileştirmek için onları daha fazla değiştirmenin bazı yollarını gördüm ve daha sonra onları daha iyi davranmaları için daha da ince ayarladım. onları daha etkili bir şekilde. Sonra başkalarının da aynı değerlendirmeyi yapmak için bu ayarlamalar yapmak isteyebileceğini düşündüm. Bu nedenle , ilk üç araçtan herhangi birinin sürümlerimi yüklemenizi sağlayacak bir kaynak paketi hazırladım . Ayrıca gerekli hg-fast-exportparçaları takmaya da dikkat etmelidir . ( hg-gitKendi başınıza kurmanız gerekir .)

Onları denemenizi ve neyin en iyi olduğuna kendiniz karar vermenizi öneririm. Bu araçların kırıldığı durumları duymaktan memnuniyet duyarım. Onları yukarı akış değişiklikleriyle eşzamanlı tutmaya çalışacağım ve yukarı akış yazarlarının yararlı olduğunu düşündüğüm ince ayarların farkında olduklarından emin olmak için çalışacağım.

Yukarıda da bahsettiğim gibi, bu araçları değerlendirirken git-hg, sadece Mercurial'dan çekmek için kullanılabilir, itmek için değil , sonuca vardım .

İlgili olarak, Git ve Mercurial arasındaki bazı yararlı karşılaştırmalar / çeviri kılavuzları, bazı durumlarda Git'i zaten bilen kullanıcıları hedeflemektedir:


2
Yöntem 2'yi kendim veya daha doğrusu benim tweaked sürümünü kullanıyorum. Genel olarak bana en güvenilir ve esnek yaklaşım (denediklerim) gibi geliyor. Ayrıntılar için inceleme / kaynak paketimin bağlantılarına bakın.
dubiousjim

Evet. Fırın Harmony harika. Solo geliştiriciler için de ücretsiz.
CAD

114

Yerel destek sağlayan yeni bir git-remote-hg var:

Git Mercurial ve Bazaar için köprü desteği

Git-remote-hg dosyasını $ PATH'nıza kopyalayın , yürütülebilir yapın ve işte bu kadar bağımlılık yok (Mercurial dışında):

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

Yerel bir Git deposu gibi itip çekebilmelisiniz.

Yeni Git dallarına bastığınızda, onlar için Mercurial yer işaretleri oluşturulur.

Daha fazla bilgi için git-remote-hg wiki'sine bakın.


14
Hey Felipe, bu tam olarak doğru değil, bağımlılık olarak mercurial'ın çalışan bir versiyonuna ihtiyacınız var
Antoine Pelisse

5
Tam olarak adlandırdığınızdan emin olun git-remote-hg(yani .pysonek yok ).
schmmd

3
Hg deposu bir alt modül olduğunda da çalışır.
Clayton Stanley

4
Python 2'ye ihtiyacınız olduğunu unutmayın. Yani python 3 sisteminizde varsayılan ise (veya Debian'ı çalıştırmıyorsanız ve geleceğe karşı kanıt olmak istiyorsanız) ilk satırı değiştirin #!/usr/bin/env python2.
Kevin Cox

4
Not Mercurial 3.2 @FelipeC 'ın git-remote-hg artık çalışmıyor çünkü o ( github.com/felipec/git-remote-hg/issues/27 konu birleştirilir düzeltmeler (bunun çatal kadar olan) GitHub .com / fingolfin / git-remote-hg )
Cimbali

106

Hg-git'i kullanabilmeniz gerekir .

hg clone <hg repository>

düzenle ~/.hgrcve ekle:

[extensions]
hgext.bookmarks =
hggit =

bir yer işareti oluşturarak mastergit git:

cd <repository>
hg bookmark -r default master

.hg/hgrcdepoda düzenleyin ve ekleyin:

[git]
intree = true

şimdi git deposunu oluşturabilirsiniz:

hg gexport

ve ortaya çıkan dizini bir git klonu olarak kullanabilirsiniz. mercurial'dan çekmek:

hg pull
hg gexport

ve civaya itmek:

hg gimport
hg push

(Evet, hg'yi bu iş akışıyla kullanmanız gerekiyor, ancak saldırılarınız hep git olacak)

Not: Bu iş akışıyla ilgili bir sorununuz varsa, lütfen bir hata gönderin.


3
önce easy_install hg-
git'i

1
Tam olarak istediğim gibi değil, ama yine de yapılabilir. Teşekkürler.
Hugo Sereno Ferreira

3
Sadece bir fyi, bir kez yerel bir hg repo (ve yanlış bir şey yapmadan) üzerinde bu işlemi geçtikten sonra git kullanarak sonuç repo klonlamak mümkün değildi. Ben kaynak hg repo "hg klonlamak", yeni hg repo adımları izleyin ve sonra git yeni hg repo klonlamak zorunda kaldı.
Rocky Burt

1
git status$ Git status fatal komutunu vermeye çalışırken bunu alıyorum : Bu işlem bir çalışma ağacında çalıştırılmalıdır Bu, hg gexporttaze klonlanmış bir hg deposunda yayınladıktan sonra . Çıplak depolarda dolaşmak için olası bir çözüm nedir? Güncelleme . Görünüşe göre, Rock Burt'un önerisi işe yarıyor. Thank you
yesudeep

1
@ Aynı sorunum var. Görünüşe göre git repo .hg / git olarak oluşturulur. Çözüm 'ln -s .hg / git .git'.
mb14

15

Deneyebilirsin hg2gitpython komut dosyası ve en bulabilirsiniz hızlı ihracat, parçası olan http://repo.or.cz/w/fast-export.git .

Yine de cıva yüklü olması gerekir.


4
Bu bir hg repo git repo dönüştürdü, çok teşekkür ederim!
27'de keşif

Bu senaryo benim için başarısız oldu, ancak orijinal iyi hg-fast-exportçalıştı
Andrei

Şu anda hg-fast-exportbetiğin gönderileceğini düşünüyorum hg2git. Yine de hepsini takip etmedim. Bu araçların tersine değil, yalnızca Hg-> Git'ten geçmesine izin verdiğini unutmayın.
dubiousjim

9

Hg-git iki yönlü bir köprü olduğundan, değişiklik kümelerini Git'ten Mercurial'a aktarmanıza izin verir.


6

Hg-Git Mercurial Eklentisi . Kendim denemedim, ama kontrol etmeye değer olabilir.


7
Bu, mercurial kullanıcıların git depolarından itip çekmesini sağlayan bir eklentidir, aksi halde OP'nin istediği şeydir.
sykora

1
@sykora, birlikte çalışabilirliği ters yönden sürmek için de kullanılabilir. Cevabımda listelediğim bazı araçları görün.
dubiousjim

6

Ben büyük başarı elde ettiler git-hgdan https://github.com/cosmin/git-hg (yükleme çalışma gerektirir hgda). Getirmeyi, çekmeyi ve itmeyi destekler ve benim için daha kararlıhg-git (benzer özelliklerden hggit'e).

Kullanım örnekleri için https://github.com/cosmin/git-hg#usage adresine bakın . Kullanıcı arayüzü çok benzergit-svn .

git-hgHer klonlanmış hg repo için ekstra disk alanı gerektirir. Uygulama tam cıva klonu, ekstra git çıplak klon ve gerçek git repo kullanır. Gerekli disk alanı, yalnızca normal git kullanımının yaklaşık 3 katıdır. Ek kopyalar, .gitçalışma dizininizin (veya GIT_DIRher zamanki gibi gösterilen konumun) dizininin altında saklanır .

Uyarı:git-hg Çözmeye çalışan temel sorun gitve hgözellikler arasında 1: 1 eşleme olmamasıdır . En büyük sorun, git şubeleri ile hg adsız şubeler ve hg adlı şubeler ve hg yer imleri arasındaki empedans uyumsuzluğudur (bunların hepsi gitkullanıcılara çok benziyor ). İlgili bir sorun, hgşube adının yalnızca varsayılan olarak şablon yürütme iletisine eklendiği git yerine sürüm geçmişine orijinal adlı şube adını kaydetmeye çalışmasıdır.

Birlikte çalışabilir köprü oluşturduğunu iddia eden gitve hgbu empedans eşleşmesiyle nasıl başa çıkacağını açıklayan herhangi bir araç . Ardından, seçilen çözümün ihtiyaçlarınıza uygun olup olmadığına karar verebilirsiniz.

Kullanılan çözüm, git-hgtüm hg yer imlerini silmek ve adlandırılmış dalları git dallarına dönüştürmektir. Ayrıca git master dalını varsayılan adlandırılmamış hg dalına ayarlar.


Görünüşe git-hggöre sadece Hg'den çekmek için değil, itmek için değil (cevabımda bağlandığım açıklamaya bakın). Her iki yönde de başarılı bir şekilde kullanmanın bir yolunu buldunuz mu? Ekstra alana gelince, tanıdığım tüm teknikler dir + bir kopya git db / metadata + bir kopya hg db / metadata içerir. Git db / meta verilerinin ikinci bir kopyasını eklemek daha fazla disk kullanımı gerektirir, evet, ancak nispeten konuşursak göründüğü kadar kötü değil.
dubiousjim

@dubiousjim İhtiyacım çalışan bir çekme / getirme ile doldu ve ben aslında hiçbir zaman itme test etmedi. Belgelere güveniyordum ama açıklamalarınızı kontrol ettikten sonra bunun git-hgitmek için uygun olmadığına inanıyorum . Cevabımı, pushyeterince kararlı olmayan daha açık hale getirmek için değiştirdim .
Mikko Rantalainen

Çok kötü, itmeyi başarıyla görmenin bir yolu olmadığını düşündüm.
dubiousjim

1
Empedans uyumsuzluğunu ve neyi arayacağınızı vurgulamak için +1
matt wilkie

3

Hggit denedim. Benim için çalışıyor, çünkü git'erlerin ve hg'lerin işleriyle başa çıkmak zorundayım. Özellikle incelemeler için bu harika.

Bu konuda küçük bir sorun / uyarı:

Hg ile istikrarlı bir linux çekirdek deposunu klonlamaya çalıştım. Bu depolar git içinde tutulur ve içinde çok sayıda dosya bulunur.

Çok yavaştı. Tam klon 2 gün götürdü ve bir çalışma kopyası güncelleme.


İyileşiyor gibi görünüyor --- kasam yaklaşık altı saattir çalışıyor ve gitmek için sadece dokuz tane daha olduğunu iddia ediyor ...
David Verilen

Onu geri alırım. Şimdi yaklaşık 25 saat sürüyor ve hala sadece dokuz tane daha olduğunu iddia ediyor. İki gün dedin mi?
David

1
Bunu yaşadım - İlk denemem hiç işe yaramadı - bir hata olduğunu varsayıyorum, ancak ikinci denememde daha fazla analiz etmedim - güncellenmiş bir hg-git ile Mac Book'umun tamamlanması neredeyse 50 saat sürdü Pro (2.66GHz, 8 Gig RAM)
Wizz,

39 saat şimdi, sadece 11 gitmek! Dört çekirdekli AMD Phenom. O edilir Ben çalıştırmak izin veriyorum, bu yüzden de ilerleme (hg ilerleme çubuğu uzantısı olan olmazsa olmaz). Bir CPU'yu sabitlemek ve hiç CPU kullanmamak ve çok fazla disk erişimi yapmak arasında değişiyor.
David,

Herkesin neden olduğu düşük performansın hggithg , genel olarak çekirdek büyüklüğündeki projelerde kullanılacak veya çok yavaş mi?
Mikko Rantalainen

1

Ben denedim Cosmin en git-hg ve abourget en git-hg-tekrar hem mutt en hg repo , daha sonra saygı iyi bir birleştirme düzeni, eski raslantısaldır gibi görünüyor. Aşağıdaki ekran görüntülerinden görebilirsiniz.

Cosmin'in git-hg tarafından içe aktarılan bir birleştirme geçmişi grafiği :

resim açıklamasını buraya girin

Abourget'in git-hg-again tarafından içe aktarılan birleştirme tarihçesi grafiği :

resim açıklamasını buraya girin

Hgk tarafından mutt'ın hg deposunda çizilen gerçek tarih grafiği:

resim açıklamasını buraya girin

Yukarıdan da görebileceğiniz gibi, abourget'in git-hg-tekrarının ikinci grafiği orijinal hgk grafiğine çok yakın ve aslında mutt'ın gerçek iş akışını yansıtıyor.

Git-hg-tekrar bulduğum bir dezavantajı, bir 'hg' uzaktan kumandası eklememesi, daha ziyade yerel etiket olarak tüm referanslarını içe aktarmasıdır, git-hg'nin harika bir 'hg' uzaktan kumandası yukarı akış hg repo'yu temsil eder.


1
Bana öyle geliyor ki, cosmin ve abourget'in versiyonları arasındaki farklar, birleştirme taahhütlerinde ebeveynlerin sırası. İyi bir tarih görselleştirme aracı (örn. gitk) Her iki tarihi de aynı şekilde işleyebilmelidir. Açıkça eksik olan tek şey, hg/stableabourget'in versiyondaki şubesidir. Sanırım Mercurial'daki adlandırılmış dallar, adlandırılmamış dallar ve yer imleri arasında bir şey var.
Mikko Rantalainen

0

Git-hg Mirror hizmeti ile iki yönlü hg-git (ve git-git, hg-hg) senkronizasyonu da mümkündür . Sahne arkasında hg-git (diğerleri arasında) kullanır ve kodu da açık kaynak kodludur.


Feragatname : Arkasındaki şirkettenim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.