Dapatkan interoperabilitas dengan Repositori Mercurial

195

Saya menggunakan GIT di Mac. Cukup kata. Saya punya alat, saya punya pengalaman. Dan saya ingin terus menggunakannya. Tidak ada perang di sini ...

Masalahnya selalu dengan interoperabilitas. Kebanyakan orang menggunakan SVN, yang bagus untuk saya. Git SVN bekerja di luar kotak, dan merupakan solusi tanpa embel-embel. Orang-orang dapat terus menggunakan SVN dengan senang hati dan saya tidak kehilangan alur kerja saya dan juga alat saya.

Sekarang ... Beberapa orang datang dengan Mercurial. Baik untuk mereka: mereka punya alasan. Tapi saya tidak dapat menemukan GIT HG di luar kotak. Saya tidak ingin beralih ke HG, tetapi saya masih perlu beroperasi dengan repositori mereka.

Adakah di antara kalian yang tahu solusi sederhana untuk ini?

Hugo Sereno Ferreira
sumber
4
hg-git bekerja di kedua arah.
Derek Mahar
1
Jawaban oleh @dubiousjim lebih berguna, komprehensif dan lebih mutakhir daripada dua teratas saat ini, yang menunjuk ke repo yang tidak dirawat atau memberikan saran yang sudah ketinggalan zaman. Namun pembaruan lebih lanjut tentang pertanyaan ini akan sangat membantu.
nealmcb

Jawaban:

60

Pembaruan dari Juni 2012. Saat ini tampaknya ada metode berikut untuk interoperabilitas Git / Hg ketika pengembang ingin bekerja dari sisi git:

  1. Instal Mercurial dan ekstensi hg-git . Anda dapat melakukan yang terakhir menggunakan manajer paket Anda, atau dengan easy_install hg-git. Kemudian pastikan yang berikut ini ada di ~ / .hgrc Anda:

    [extensions]
    hggit = 
    

    Anda mungkin melihat beberapa referensi yang berbicara tentang menentukan bookmarksekstensi di sini juga, tetapi yang telah dibangun ke Mercurial sejak v 1.8. Berikut adalah beberapa tips tentang menginstal hg-git di Windows .

    Setelah memiliki hg-git, Anda dapat menggunakan perintah secara kasar seperti Abderrahim Kitouni yang diposting di atas . Metode ini telah disempurnakan dan dimodifikasi sejak 2009, dan ada pembungkus ramah: git-hg-lagi . Ini menggunakan direktori tingkat atas sebagai direktori yang berfungsi untuk Mercurial dan Git secara bersamaan. Itu membuat bookmark Mercurial yang tetap selaras dengan ujung defaultcabang (tidak disebutkan namanya) dalam repositori Mercurial, dan memperbarui cabang Git lokal dari bookmark itu.

  2. git-remote-hg adalah pembungkus yang berbeda, juga didasarkan padahg-gitekstensiMercurial. Ini juga menggunakangit-remote-helpersprotokol (maka namanya). Ia menggunakan direktori tingkat atas hanya untuk direktori kerja Git; itu membuat repositori Mercurial tetap kosong. Ini juga mempertahankan repositori telanjang Git kedua untuk membuat sinkronisasi antara Git dan Mercurial lebih aman dan lebih seperti git suka secara idiomatis.

  3. The git-hg naskah (sebelumnya dipelihara di sini ) menggunakan metode yang berbeda, berdasarkan hg-fast-exportdari proyek cepat-ekspor . Seperti metode 2, ini juga menyimpan repositori Mercurial kosong dan repositori telanjang Git tambahan.

    Untuk menarik, alat ini mengabaikan bookmark Mercurial dan sebagai gantinya mengimpor setiap cabang Mercurial bernama ke cabang Git, dan cabang Mercurial default (tanpa nama) menjadi master.

    Beberapa komentar membahas alat ini hanya sebagai hg-> git, tetapi mengklaim telah bergabung dalam dukungan push git-> hg pada 7 Desember 2011. Namun, seperti yang saya jelaskan dalam ulasan alat ini , cara alat ini mencoba menerapkan dukungan push tampaknya tidak bisa diterapkan.

  4. Ada juga proyek lain yang disebut git-remote-hg . Tidak seperti versi yang tercantum di atas, yang ini tidak bergantung pada hg-git, tetapi langsung mengakses Mercurial Python API. Saat ini, menggunakannya juga membutuhkan versi git yang ditambal. Saya belum mencoba ini.

  5. Akhirnya, Penjahit adalah proyek yang secara bertahap mengkonversi antara berbagai VCS yang berbeda. Sepertinya pengembangan ini tidak akan dilanjutkan secara agresif.

Tiga pendekatan pertama ini terlihat cukup ringan untuk membujuk saya untuk menyelidikinya. Saya perlu men-tweak mereka dalam beberapa cara untuk membuatnya berjalan pada setup saya, dan saya melihat beberapa cara untuk men-tweak mereka lebih lanjut untuk meningkatkan mereka, dan kemudian saya men-tweak mereka lebih jauh untuk membuat mereka berperilaku lebih seperti satu sama lain sehingga saya bisa mengevaluasi mereka lebih efektif. Kemudian saya pikir orang lain mungkin juga ingin melakukan tweak ini, untuk melakukan evaluasi yang sama. Jadi saya telah membuat paket sumber yang akan memungkinkan Anda untuk menginstal versi saya dari salah satu dari tiga alat pertama. Itu juga harus mengurus menginstal hg-fast-exportpotongan yang dibutuhkan . (Anda harus menginstal hg-gitsendiri.)

Saya mendorong Anda untuk mencobanya dan memutuskan sendiri apa yang paling berhasil. Saya akan senang mendengar tentang kasus di mana alat ini pecah. Saya akan mencoba untuk tetap selaras dengan perubahan hulu, dan untuk memastikan penulis hulu menyadari tweak saya pikir berguna.

Seperti yang saya sebutkan di atas, dalam mengevaluasi alat-alat ini, saya sampai pada kesimpulan bahwa git-hghanya dapat digunakan untuk menarik dari Mercurial, bukan untuk mendorong.

Terkait, berikut adalah beberapa perbandingan / manual terjemahan bermanfaat antara Git dan Mercurial, dalam beberapa kasus ditargetkan pada pengguna yang sudah tahu Git:

dubiousjim
sumber
2
Saya menggunakan metode # 2 sendiri, atau lebih tepatnya versi tweak saya itu. Secara keseluruhan menurut saya pendekatan yang paling dapat diandalkan dan fleksibel (dari yang saya coba). Lihat tautan ke paket ulasan / sumber saya untuk detailnya.
dubiousjim
Ya. Kiln Harmony mengagumkan. Gratis untuk pengembang solo juga.
CAD berbicara
114

Ada git-remote-hg baru yang menyediakan dukungan asli:

Dukungan jembatan di Git untuk Mercurial dan Bazaar

Cukup salin git-remote-hg ke $ PATH Anda, buat itu dapat dieksekusi, dan hanya itu, tidak ada dependensi (selain Mercurial):

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

Anda harus dapat mendorong dan menariknya seolah-olah itu adalah repositori asli Git.

Saat Anda mendorong cabang Git baru, bookmark Mercurial akan dibuat untuk mereka.

Lihat wiki git-remote-hg untuk informasi lebih lanjut.

FelipeC
sumber
14
Hei Felipe, itu tidak sepenuhnya benar, Anda memerlukan versi kerja lincah sebagai ketergantungan
Antoine Pelisse
5
Pastikan Anda memberi nama persis git-remote-hg(yaitu tidak ada .pyakhiran).
schmmd
3
Bekerja ketika repositori hg juga merupakan submodule.
Clayton Stanley
4
Perhatikan bahwa Anda memerlukan python 2. Jadi jika python 3 adalah default pada sistem Anda (atau jika Anda tidak menjalankan Debian dan ingin menjadi bukti masa depan) ubah baris pertama menjadi #!/usr/bin/env python2.
Kevin Cox
4
Perhatikan bahwa karena Mercurial 3.2 @FelipeC, git-remote-hg tidak berfungsi lagi ( github.com/felipec/git-remote-hg/issues/27 ), hingga garpu yang memperbaiki masalah tersebut bergabung (lihat github .com / fingolfin / git-remote-hg )
Cimbali
106

Anda harus bisa menggunakan hg-git .

hg clone <hg repository>

edit ~/.hgrcdan tambahkan:

[extensions]
hgext.bookmarks =
hggit =

buat bookmark sehingga Anda akan memiliki masterin git:

cd <repository>
hg bookmark -r default master

edit .hg/hgrcdi repositori dan tambahkan:

[git]
intree = true

sekarang Anda dapat membuat repositori git:

hg gexport

dan Anda dapat menggunakan direktori yang dihasilkan sebagai klon git. menarik dari lincah adalah:

hg pull
hg gexport

dan mendorong untuk lincah:

hg gimport
hg push

(Ya, Anda harus menggunakan hg dengan alur kerja ini tetapi peretasan Anda akan sepenuhnya aktif)

PS Jika Anda memiliki masalah dengan alur kerja ini, silakan ajukan bug.

Abderrahim Kitouni
sumber
3
jangan lupa untuk menjalankan easy_install hg-git dulu
Christian Oudard
1
Bukan apa yang saya inginkan, tetapi masih bisa dilakukan. Terima kasih.
Hugo Sereno Ferreira
3
Hanya fyi, setelah menjalankan proses ini sekali pada repo hg lokal (dan melakukan sesuatu yang salah), saya tidak dapat mengkloning repo yang dihasilkan menggunakan git. Saya harus "hg mengkloning" sumber hg repo, ikuti langkah-langkah pada repo hg baru, dan kemudian git klon repo hg baru.
Rocky Burt
1
Saya mendapatkan ini ketika mencoba mengeluarkan git statusperintah $ git status fatal: Operasi ini harus dijalankan di pohon kerja. Ini setelah saya mengeluarkan hg gexportrepositori hg yang baru dikloning. Apa yang mungkin dilakukan untuk berkeliling di repositori telanjang? Perbarui . Rupanya, saran Rock Burt berhasil. Terima kasih
yesudeep
1
@ Don, saya punya masalah yang sama. Rupanya repo git dibuat sebagai .hg / git. Solusinya adalah dengan 'ln -s .hg / git .git'.
mb14
15

Anda dapat mencoba hg2git, yang merupakan skrip python dan merupakan bagian dari ekspor cepat, yang dapat Anda temukan di http://repo.or.cz/w/fast-export.git .

Anda harus menginstal lincah.

sykora
sumber
4
Ini mengubah repo hg menjadi repo git, terima kasih banyak!
Mengulang
Skrip ini gagal untuk saya, tetapi aslinya hg-fast-exportberfungsi dengan baik
Andrei
Saya pikir saat ini hg-fast-exportskrip dikirim ke hg2git. Saya belum melacak semuanya. Perhatikan bahwa alat ini hanya mengizinkan pergi dari Hg-> Git, bukan sebaliknya.
dubiousjim
9

Karena hg-git adalah jembatan dua arah , ini juga memungkinkan Anda untuk mendorong perubahan dari Git ke Mercurial.

Martin Geisler
sumber
6

Plugin Hg-Git Mercurial . Belum mencobanya sendiri, tetapi mungkin perlu dicoba.

ralphtheninja
sumber
7
Ini adalah plugin yang memungkinkan pengguna lincah untuk mendorong dan menarik dari git repos, bukan sebaliknya, yang diinginkan OP.
sykora
1
@ sykora, dapat digunakan untuk mendorong interoperabilitas dari arah sebaliknya juga. Lihat beberapa alat yang saya daftarkan dalam jawaban saya.
dubiousjim
6

Saya telah sukses besar dengan git-hgdari https://github.com/cosmin/git-hg (memerlukan instal yang berfungsi hgjuga). Ini mendukung fetch, pull dan push dan lebih stabil untuk saya daripada hg-git(fitur serupa dari hgke git).

Lihat https://github.com/cosmin/git-hg#usage untuk contoh penggunaan. Antarmuka pengguna sangat mirip dengan git-svn.

The git-hgmembutuhkan ruang disk tambahan untuk setiap hg repo kloning. Implementasinya menggunakan klon mercurial penuh, klon git ekstra ekstra dan repo git yang sebenarnya. Ruang disk yang dibutuhkan kira-kira 3 kali penggunaan normal git saja. Salinan tambahan disimpan di bawah .gitdirektori direktori kerja Anda (atau lokasi ditunjuk GIT_DIRseperti biasa).

Perhatian: Masalah dasar yang git-hgmencoba untuk dipecahkan adalah tidak ada pemetaan 1: 1 antara gitdan hgfitur. Masalah terbesar adalah ketidakcocokan impedansi antara cabang git dan hg cabang yang tidak disebutkan namanya dan hg bernama cabang dan bookmark hg (semuanya terlihat sangat mirip cabang untuk gitpengguna). Masalah terkait adalah hgmencoba untuk menyimpan nama cabang bernama asli dalam riwayat versi sebagai lawan git di mana nama cabang hanya ditambahkan ke pesan templat komitmen secara default.

Setiap alat yang mengklaim membuat jembatan interoperable antara gitdan hgharus menjelaskan bagaimana itu akan berurusan dengan pertandingan impedansi ini. Anda kemudian dapat memutuskan apakah solusi yang dipilih sesuai dengan kebutuhan Anda.

Solusi yang git-hgdigunakan adalah membuang semua bookmark hg dan mengonversi cabang bernama ke cabang git. Selain itu ia menetapkan cabang master git ke cabang hg default yang tidak disebutkan namanya.

Mikko Rantalainen
sumber
Sepertinya git-hghanya layak untuk menarik dari Hg, bukan untuk mendorong (lihat penjelasan yang saya tautkan dalam jawaban saya). Sudahkah Anda menemukan cara untuk berhasil menggunakannya di kedua arah? Mengenai ruang tambahan, semua teknik yang saya kenal melibatkan kerja dir + satu salinan git db / metadata + satu salinan hg db / metadata. Menambahkan salinan kedua dari git db / metadata memang melibatkan lebih banyak penggunaan disk, ya, tetapi secara komparatif itu tidak seburuk kelihatannya.
dubiousjim
@dubiousjim Kebutuhan saya dipenuhi dengan tarikan / pengambilan yang berfungsi dan saya tidak pernah benar-benar menguji dorongan. Saya mempercayai dokumentasinya tetapi setelah memeriksa penjelasan Anda, saya sekarang percaya bahwa git-hgtidak cocok untuk mendorong. Saya memodifikasi jawaban saya untuk membuatnya lebih jelas bahwa pushitu tidak cukup stabil.
Mikko Rantalainen
Sayang sekali, saya pikir mungkin ada beberapa cara untuk menggunakan push dengan sukses yang tidak saya lihat.
dubiousjim
1
+1 untuk menyoroti ketidakcocokan impedansi dan apa yang harus dicari
matt wilkie
3

Sudah mencoba hggit. Bekerja untuk saya, karena saya harus mengatasi pekerjaan git'ers dan hg'ers. Khusus untuk ulasan, ini sangat bagus.

Masalah kecil / peringatan pada topik itu:

Saya telah mencoba mengkloning repositori kernel linux yang stabil dengan hg. Repositori ini disimpan dalam git dan biasanya memiliki sejumlah besar file di dalamnya.

Sangat lambat. Butuh waktu 2 hari untuk sepenuhnya mengkloning dan memperbarui copy pekerjaan.

Wizz
sumber
Tampaknya menjadi lebih baik --- checkout saya telah berjalan selama sekitar enam jam, dan mengklaim hanya ada sembilan yang tersisa ...
David Diberikan
Saya ambil itu kembali. Sekarang sudah berjalan sekitar 25 jam, dan masih mengklaim hanya ada sembilan yang tersisa. Dua hari, katamu?
David Diberikan
1
Saya mengalaminya - Percobaan pertama saya tidak berhasil sama sekali - saya anggap itu adalah bug, tetapi tidak pernah menganalisis lebih lanjut, pada percobaan kedua saya - dengan pembaruan hg-git, butuh hampir 50 jam untuk menyelesaikannya di Mac Book saya Pro (2.66GHz, 8 Gig RAM)
Wizz
39 jam sekarang, jadi hanya tinggal 11 jam lagi! Quad core AMD Phenom. Hal ini membuat kemajuan, itulah sebabnya aku membiarkan berjalan (dengan hg progress bar ekstensi adalah must-have). Ini bergantian antara mematok satu CPU dan tidak menggunakan CPU sama sekali dan melakukan banyak akses disk.
David Diberikan
Adakah yang menguji apakah kinerja buruk yang disebabkan oleh hggitatau hgterlalu lambat untuk dapat digunakan dengan proyek ukuran kernel secara umum?
Mikko Rantalainen
1

Saya telah mencoba cosmin's git-hg dan abourget's git-hg-lagi baik pada repo hg mutt , tampaknya kemudian menghormati urutan penggabungan sumur, yang pertama agak acak. Anda dapat melihat dari screenshot di bawah ini.

Grafik riwayat penggabungan mutt yang diimpor oleh cosmin's git-hg :

masukkan deskripsi gambar di sini

Grafik riwayat penggabungan mutt yang diimpor oleh abourget's git-hg-again :

masukkan deskripsi gambar di sini

Grafik riwayat aktual yang diplot oleh hgk pada repositori hg mutt's:

masukkan deskripsi gambar di sini

Seperti yang dapat Anda lihat di atas, grafik kedua oleh abourget's git-hg-lagi sangat dekat dengan grafik hgk asli dan sebenarnya mencerminkan alur kerja nyata dari mutt.

Salah satu kekurangan dari git-hg-lagi yang saya temukan adalah ia tidak menambahkan remote 'hg', melainkan mengimpor semua referensi sebagai tag lokal, git-hg memiliki remote 'hg' yang indah mewakili repo hg hulu.

weynhamz
sumber
1
Tampak bagi saya bahwa perbedaan antara versi oleh cosmin dan abourget adalah urutan orang tua dalam menggabungkan komit. Alat visualisasi riwayat yang baik (misalnya gitk) harus dapat membuat kedua riwayat secara identik. Satu-satunya hal yang jelas hilang adalah cabang hg/stabledalam versi oleh abourget. Saya kira itu adalah hal antara cabang bernama, cabang tidak dikenal dan bookmark di Mercurial.
Mikko Rantalainen
0

Sinkronisasi hg-git dua arah (dan git-git, hg-hg) juga dimungkinkan dengan layanan Git-hg Mirror . Ia menggunakan hg-git (antara lain) di belakang layar dan kodenya juga open source.


Penafian : Saya dari perusahaan di belakangnya.

Piedone
sumber