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?
Jawaban:
Pembaruan dari Juni 2012. Saat ini tampaknya ada metode berikut untuk interoperabilitas Git / Hg ketika pengembang ingin bekerja dari sisi git:
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:Anda mungkin melihat beberapa referensi yang berbicara tentang menentukan
bookmarks
ekstensi 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
default
cabang (tidak disebutkan namanya) dalam repositori Mercurial, dan memperbarui cabang Git lokal dari bookmark itu.git-remote-hg adalah pembungkus yang berbeda, juga didasarkan pada
hg-git
ekstensiMercurial. Ini juga menggunakangit-remote-helpers
protokol (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.The git-hg naskah (sebelumnya dipelihara di sini ) menggunakan metode yang berbeda, berdasarkan
hg-fast-export
dari 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.
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.
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-export
potongan yang dibutuhkan . (Anda harus menginstalhg-git
sendiri.)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-hg
hanya 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:
sumber
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):
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.
sumber
git-remote-hg
(yaitu tidak ada.py
akhiran).#!/usr/bin/env python2
.Anda harus bisa menggunakan hg-git .
edit
~/.hgrc
dan tambahkan:buat bookmark sehingga Anda akan memiliki
master
in git:edit
.hg/hgrc
di repositori dan tambahkan:sekarang Anda dapat membuat repositori git:
dan Anda dapat menggunakan direktori yang dihasilkan sebagai klon git. menarik dari lincah adalah:
dan mendorong untuk lincah:
(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.
sumber
git status
perintah $ git status fatal: Operasi ini harus dijalankan di pohon kerja. Ini setelah saya mengeluarkanhg gexport
repositori hg yang baru dikloning. Apa yang mungkin dilakukan untuk berkeliling di repositori telanjang? Perbarui . Rupanya, saran Rock Burt berhasil. Terima kasihAnda 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.
sumber
hg-fast-export
berfungsi dengan baikhg-fast-export
skrip dikirim kehg2git
. Saya belum melacak semuanya. Perhatikan bahwa alat ini hanya mengizinkan pergi dari Hg-> Git, bukan sebaliknya.Karena hg-git adalah jembatan dua arah , ini juga memungkinkan Anda untuk mendorong perubahan dari Git ke Mercurial.
sumber
Plugin Hg-Git Mercurial . Belum mencobanya sendiri, tetapi mungkin perlu dicoba.
sumber
Saya telah sukses besar dengan
git-hg
dari https://github.com/cosmin/git-hg (memerlukan instal yang berfungsihg
juga). Ini mendukung fetch, pull danpushdan lebih stabil untuk saya daripadahg-git
(fitur serupa darihg
ke git).Lihat https://github.com/cosmin/git-hg#usage untuk contoh penggunaan. Antarmuka pengguna sangat mirip dengan
git-svn
.The
git-hg
membutuhkan 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.git
direktori direktori kerja Anda (atau lokasi ditunjukGIT_DIR
seperti biasa).Perhatian: Masalah dasar yang
git-hg
mencoba untuk dipecahkan adalah tidak ada pemetaan 1: 1 antaragit
danhg
fitur. 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 untukgit
pengguna). Masalah terkait adalahhg
mencoba 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
git
danhg
harus menjelaskan bagaimana itu akan berurusan dengan pertandingan impedansi ini. Anda kemudian dapat memutuskan apakah solusi yang dipilih sesuai dengan kebutuhan Anda.Solusi yang
git-hg
digunakan 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.sumber
git-hg
hanya 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.git-hg
tidak cocok untuk mendorong. Saya memodifikasi jawaban saya untuk membuatnya lebih jelas bahwapush
itu tidak cukup stabil.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.
sumber
hggit
atauhg
terlalu lambat untuk dapat digunakan dengan proyek ukuran kernel secara umum?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 :
Grafik riwayat penggabungan mutt yang diimpor oleh abourget's git-hg-again :
Grafik riwayat aktual yang diplot oleh hgk pada repositori hg mutt's:
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.
sumber
gitk
) harus dapat membuat kedua riwayat secara identik. Satu-satunya hal yang jelas hilang adalah cabanghg/stable
dalam versi oleh abourget. Saya kira itu adalah hal antara cabang bernama, cabang tidak dikenal dan bookmark di Mercurial.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.
sumber