Khả năng tương tác của Git với Kho lưu trữ Mercurial


195

Tôi sử dụng GIT trên máy Mac. Đủ nói. Tôi có các công cụ, tôi có kinh nghiệm. Và tôi muốn tiếp tục sử dụng nó. Không có chiến tranh ở đây ...

Vấn đề luôn luôn là với khả năng tương tác. Hầu hết mọi người sử dụng SVN, điều này rất tốt cho tôi. Git SVN hoạt động tốt, và là một giải pháp không rườm rà. Mọi người có thể tiếp tục vui vẻ sử dụng SVN và tôi không mất quy trình làm việc và các công cụ của mình.

Bây giờ ... Một số kẻ đi cùng với Mercurial. Tốt cho họ: họ có lý do của họ. Nhưng tôi không thể tìm thấy bất kỳ GIT HG nào. Tôi không muốn chuyển sang HG, nhưng tôi vẫn cần phải tương tác với kho lưu trữ của họ.

Bất cứ ai trong số các bạn biết một giải pháp đơn giản cho việc này?


4
hg-git không hoạt động theo cả hai hướng.
Derek Mahar

1
Câu trả lời của @dubiousjim là hữu ích, toàn diện và cập nhật hơn so với hai trang web hiện tại, đang chỉ ra các repos không rõ ràng hoặc đưa ra lời khuyên lỗi thời. Nhưng những cập nhật nhiều hơn về câu hỏi này sẽ rất hữu ích.
nealmcb

Câu trả lời:


60

Cập nhật từ tháng 6 năm 2012. Hiện tại dường như có các phương pháp sau đây cho khả năng tương tác Git / Hg khi nhà phát triển muốn làm việc từ phía git:

  1. Cài đặt Mercurial và phần mở rộng hg-git . Bạn có thể thực hiện sau bằng trình quản lý gói của mình hoặc với easy_install hg-git. Sau đó, đảm bảo những điều sau đây nằm trong ~ / .hgrc của bạn:

    [extensions]
    hggit = 
    

    Bạn cũng có thể thấy một số tài liệu tham khảo nói về việc chỉ định bookmarkstiện ích mở rộng ở đây, nhưng điều đó đã được tích hợp vào Mercurial kể từ phiên bản 1.8. Dưới đây là một số mẹo về cài đặt hg-git trên Windows .

    Khi bạn có hg-git, bạn có thể sử dụng các lệnh đại khái như Abderrahim Kitouni đã đăng ở trên . Phương pháp này đã được tinh chỉnh và điều chỉnh từ năm 2009, và có một trình bao bọc thân thiện: git-hg-again . Điều này sử dụng thư mục toplevel như một thư mục làm việc cho cả Mercurial và Git cùng một lúc. Nó tạo ra một dấu trang Mercurial mà nó giữ đồng bộ với đầu của nhánh default(chưa được đặt tên) trong kho lưu trữ Mercurial và nó cập nhật một nhánh Git cục bộ từ dấu trang đó.

  2. git-remote-hg là một trình bao bọc khác, cũng dựa trênhg-gitphần mở rộngMercurial. Điều này cũng sử dụng cácgit-remote-helpersgiao thức (do đó tên của nó). Nó chỉ sử dụng thư mục toplevel cho thư mục làm việc Git; nó giữ cho kho chứa Mercurial của nó trống. Nó cũng duy trì một kho lưu trữ Git trần thứ hai để làm cho việc đồng bộ giữa Git và Mercurial an toàn hơn và dễ hiểu hơn.

  3. Các git-hg kịch bản (trước đây duy trì ở đây ) sử dụng một phương pháp khác nhau, dựa trên hg-fast-exporttừ dự án nhanh xuất khẩu . Giống như phương pháp 2, điều này cũng giữ một kho lưu trữ Mercurial trần và một kho lưu trữ Git trần bổ sung.

    Để kéo, công cụ này bỏ qua các dấu trang Mercurial và thay vào đó, nhập mọi nhánh Mercurial có tên vào nhánh Git và nhánh Mercurial mặc định (không tên) thành chủ.

    Một số bình luận thảo luận về công cụ này là chỉ hg-> git, nhưng nó tuyên bố đã hợp nhất trong git-> hg hỗ trợ đẩy vào ngày 7 tháng 12 năm 2011. Tuy nhiên, khi tôi giải thích trong một đánh giá về các công cụ này , cách thức công cụ này cố gắng thực hiện hỗ trợ đẩy dường như không thể thực hiện được.

  4. Ngoài ra còn có một dự án khác gọi là git-remote-hg . Không giống như phiên bản được liệt kê ở trên, phiên bản này không dựa vào hg-git, mà thay vào đó truy cập trực tiếp vào API Python của Mercurial. Hiện tại, sử dụng nó cũng yêu cầu một phiên bản git vá. Tôi chưa thử cái này bao giờ.

  5. Cuối cùng, Tailor là một dự án chuyển đổi tăng dần giữa nhiều loại VCS khác nhau. Có vẻ như sự phát triển này sẽ không được tiếp tục mạnh mẽ.

Ba cách tiếp cận đầu tiên này trông đủ nhẹ để thuyết phục tôi điều tra. Tôi cần phải tinh chỉnh chúng theo một số cách để khiến chúng chạy trên thiết lập của mình và tôi đã thấy một số cách để tinh chỉnh chúng hơn nữa để cải thiện chúng, và sau đó tôi vẫn điều chỉnh chúng hơn nữa để chúng hoạt động giống nhau hơn để tôi có thể đánh giá chúng hiệu quả hơn. Sau đó, tôi nghĩ rằng những người khác cũng có thể muốn có những điều chỉnh này, để thực hiện đánh giá tương tự. Vì vậy, tôi đã tạo một gói nguồn cho phép bạn cài đặt các phiên bản của tôi trong bất kỳ ba công cụ đầu tiên nào. Nó cũng nên chăm sóc cài đặt các phần cần thiết hg-fast-export. (Bạn cần tự cài đặt hg-git.)

Tôi khuyến khích bạn dùng thử chúng và tự quyết định những gì hoạt động tốt nhất. Tôi sẽ rất vui khi nghe về những trường hợp các công cụ này bị hỏng. Tôi sẽ cố gắng giữ chúng đồng bộ với các thay đổi ngược dòng và để đảm bảo các tác giả ngược dòng nhận thức được các điều chỉnh mà tôi nghĩ là hữu ích.

Như tôi đã đề cập ở trên, khi đánh giá các công cụ này, tôi đã đi đến kết luận git-hgchỉ có thể sử dụng để lấy từ Mercurial, không phải để đẩy.

Liên quan, đây là một số so sánh hữu ích / hướng dẫn dịch giữa Git và Mercurial, trong một số trường hợp được nhắm mục tiêu vào những người dùng đã biết Git:


2
Tôi đang sử dụng phương pháp # 2 cho chính mình, hay đúng hơn là phiên bản tinh chỉnh của nó. Nhìn chung, đó dường như là cách tiếp cận linh hoạt và đáng tin cậy nhất (trong số những cách tôi đã thử). Xem các liên kết đến gói đánh giá / nguồn của tôi để biết chi tiết.
dubiousjim

Vâng Kiln Harmony thật tuyệt vời. Miễn phí cho các nhà phát triển solo quá.
CAD bloke

114

Có một git-remote-hg mới cung cấp hỗ trợ riêng:

Hỗ trợ cầu trong Git cho Mercurial và Bazaar

Chỉ cần sao chép git-remote-hg vào $ PATH của bạn, làm cho nó có thể thực thi được và đó là nó, không phụ thuộc (trừ Mercurial):

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

Bạn sẽ có thể đẩy và kéo từ nó như thể nó là một kho lưu trữ Git riêng.

Khi bạn đẩy các nhánh Git mới, dấu trang Mercurial sẽ được tạo cho chúng.

Xem wiki git-remote-hg để biết thêm thông tin.


14
Này Felipe, điều đó không chính xác, bạn cần một phiên bản hoạt động của đồng bóng như một sự phụ thuộc
Antoine Pelisse

5
Hãy chắc chắn rằng bạn đặt tên chính xác git-remote-hg(tức là không có .pyhậu tố).
schmmd

3
Hoạt động khi kho hg là một mô hình con là tốt.
Clayton Stanley

4
Lưu ý rằng bạn cần python 2. Vì vậy, nếu python 3 là mặc định trên hệ thống của bạn (hoặc nếu bạn không chạy Debian và muốn là bằng chứng trong tương lai), hãy thay đổi dòng đầu tiên thành #!/usr/bin/env python2.
Kevin Cox

4
Lưu ý rằng vì git-remote-hg của Mercurial 3.2 không hoạt động nữa ( github.com/felipec/git-remote-hg/issues/27 ), cho đến khi ngã ba khắc phục sự cố được hợp nhất (xem github .com / fingerolfin / git-remote-hg )
Cimbali

106

Bạn sẽ có thể sử dụng hg-git .

hg clone <hg repository>

chỉnh sửa ~/.hgrcvà thêm:

[extensions]
hgext.bookmarks =
hggit =

tạo một dấu trang để bạn sẽ có một mastergit:

cd <repository>
hg bookmark -r default master

chỉnh sửa .hg/hgrctrong kho lưu trữ và thêm:

[git]
intree = true

bây giờ bạn có thể tạo kho git:

hg gexport

và bạn có thể sử dụng thư mục kết quả như một bản sao git. kéo từ đồng bóng sẽ là:

hg pull
hg gexport

và đẩy đến đồng bóng:

hg gimport
hg push

(Có, bạn cần sử dụng hg với quy trình công việc này nhưng việc hack của bạn sẽ hoàn toàn trong git)

PS Nếu bạn gặp vấn đề với quy trình làm việc này, vui lòng báo lỗi.


3
đừng quên chạy easy_install hg-git trước
Christian Oudard

1
Không chính xác những gì tôi muốn, nhưng vẫn có thể làm được. Cảm ơn.
Hugo Sereno Ferreira

3
Chỉ là một fyi, sau khi chạy qua quy trình này một lần trên một repo hg cục bộ (và làm điều gì đó sai) tôi đã không thể sao chép repo kết quả bằng git. Tôi đã phải "hg clone" nguồn hg repo, làm theo các bước trên repo hg mới, và sau đó git clone hg repo mới.
Rocky Burt

1
Tôi nhận được điều này khi cố gắng đưa ra git statuslệnh $ git status fatal: Thao tác này phải được chạy trong cây công việc Đây là sau khi tôi đã phát hành một hg gexportkho lưu trữ hg mới được nhân bản. Một công việc có thể ra để có được xung quanh kho lưu trữ trần là gì? Cập nhật . Rõ ràng, đề nghị của Rock Burt hoạt động. Cảm ơn bạn
yesudeep

1
@ThaDon Mình cũng có vấn đề tương tự. Rõ ràng repo git được tạo ra là .hg / git. Giải pháp là 'ln -s .hg / git .git'.
mb14

15

Bạn có thể thử hg2git, đó là tập lệnh python và là một phần của xuất nhanh, bạn có thể tìm thấy tại http://repo.or.cz/w/fast-export.git .

Bạn sẽ cần phải cài đặt đồng bóng mặc dù.


4
Điều này đã chuyển đổi một repo hg thành một repo git, cảm ơn bạn rất nhiều!
recbot

Kịch bản này thất bại với tôi, nhưng bản gốc hg-fast-exportđã hoạt động tốt
Andrei

Tôi nghĩ rằng hiện tại hg-fast-exportkịch bản gửi đến hg2git. Tôi đã không truy tìm tất cả ra mặc dù. Lưu ý rằng các công cụ này chỉ cho phép đi từ Hg-> Git, không phải ngược lại.
dubiousjim

9

Vì hg-git là một cây cầu hai chiều, nó cũng sẽ cho phép bạn đẩy các thay đổi từ Git sang Mercurial.


6

Plugin Hg-Git Mercurial . Không thử bản thân mình, nhưng có thể đáng để kiểm tra.


7
Đây là một plugin cho phép người dùng đồng bóng đẩy và kéo từ git repos, không phải cách khác, đó là những gì OP muốn.
sykora

1
@sykora, nó cũng có thể được sử dụng để điều khiển khả năng tương tác từ hướng ngược lại. Xem một số công cụ tôi liệt kê trong câu trả lời của tôi.
dubiousjim

6

Tôi đã có thành công lớn với git-hgtừ https://github.com/cosmin/git-hg (cũng yêu cầu cài đặt làm việc hg). Nó hỗ trợ tìm nạp, kéo và đẩy và ổn định hơn đối với tôi hg-git(các tính năng tương tự từ hggit).

Xem https://github.com/cosmin/git-hg#usage để biết ví dụ sử dụng. Giao diện người dùng rất giống với git-svn.

Yêu git-hgcầu thêm không gian đĩa cho mỗi repo hg nhân bản. Việc thực hiện sử dụng bản sao đầy đủ đồng bóng, một bản sao trần git phụ và repo git thực tế. Dung lượng đĩa yêu cầu gấp khoảng 3 lần chỉ sử dụng git bình thường. Các bản sao bổ sung được lưu trữ bên dưới .gitthư mục của thư mục làm việc của bạn (hoặc vị trí được chỉ ra GIT_DIRnhư bình thường).

Lưu ý: Vấn đề cơ bản git-hgcố gắng giải quyết là không có ánh xạ 1: 1 giữa githgcác tính năng. Vấn đề lớn nhất là không phù hợp trở kháng giữa các chi nhánh git và chi nhánh giấu tên hgchi nhánh hg tênbookmark hg (tất cả những cái nhìn rất giống các chi nhánh để gitngười dùng). Một vấn đề liên quan là hgcố gắng lưu tên chi nhánh có tên gốc trong lịch sử phiên bản trái ngược với git trong đó tên chi nhánh chỉ được thêm vào thông báo cam kết mẫu theo mặc định.

Bất kỳ công cụ nào tuyên bố sẽ tạo cầu nối có thể tương tác giữa githgnên giải thích cách nó sẽ đối phó với kết hợp trở kháng này. Sau đó, bạn có thể quyết định xem giải pháp được chọn có phù hợp với nhu cầu của bạn không.

Giải pháp git-hgsử dụng là loại bỏ tất cả các dấu hg và chuyển đổi các nhánh được đặt tên thành các nhánh git. Ngoài ra, nó đặt nhánh git master thành nhánh hg không tên.


Có vẻ như git-hgchỉ khả thi khi lấy từ Hg, không phải để đẩy (xem phần giải thích tôi liên kết đến trong câu trả lời của tôi). Bạn đã tìm thấy một số cách để sử dụng thành công theo cả hai hướng? Đối với không gian thêm, tất cả các kỹ thuật tôi quen thuộc liên quan đến thư mục làm việc + một bản sao của git db / siêu dữ liệu + một bản sao của hg db / siêu dữ liệu. Thêm một bản sao thứ hai của git db / siêu dữ liệu liên quan đến việc sử dụng nhiều đĩa hơn, vâng, nhưng nói một cách tương đối thì nó không tệ như nó có vẻ như.
dubiousjim

@dubiousjim Nhu cầu của tôi đã được đáp ứng đầy đủ với một lần kéo / tìm nạp hoạt động và tôi chưa bao giờ thực sự thử nghiệm việc đẩy. Tôi đã tin tưởng vào tài liệu này nhưng sau khi kiểm tra lời giải thích của bạn, bây giờ tôi tin rằng git-hgnó không phù hợp để đẩy. Tôi đã sửa đổi câu trả lời của mình để làm rõ hơn rằng pushnó không đủ ổn định.
Mikko Rantalainen

Quá tệ, tôi nghĩ có thể có một số cách để sử dụng đẩy thành công mà tôi không thấy.
dubiousjim

1
+1 để làm nổi bật sự không phù hợp trở kháng và những gì cần tìm kiếm
matt wilkie

3

Đã thử hggit. Làm việc cho tôi, vì tôi phải đối phó với công việc của git'ers và hg'ers. Đặc biệt đối với đánh giá này là tuyệt vời.

Một vấn đề nhỏ / cảnh báo về chủ đề đó:

Tôi đã cố gắng sao chép một kho lưu trữ kernel linux ổn định với hg. Các kho lưu trữ này được duy trì trong git và thường có một số lượng lớn các tệp trong đó.

Nó rất chậm. Mất 2 ngày để sao chép hoàn toàn cập nhật một bản sao hoạt động.


Nó dường như trở nên tốt hơn --- thanh toán của tôi đã hoạt động được khoảng sáu giờ và nó tuyên bố chỉ còn chín giờ nữa ...
David đưa ra

Tôi lấy lại cái đó. Bây giờ nó đã chạy được khoảng 25 giờ và nó vẫn tuyên bố chỉ còn chín giờ nữa. Hai ngày, bạn nói gì?
David đưa ra

1
Tôi đã trải nghiệm điều đó - Lần thử đầu tiên của tôi hoàn toàn không hoạt động - Tôi cho rằng đó là một số lỗi, nhưng chưa bao giờ phân tích thêm nữa, trong lần thử thứ hai - với một hg-git cập nhật, tôi đã mất gần 50 giờ để hoàn thành trên Mac Book của mình Pro (2,66GHz, RAM 8 Gig)
Wizz

39 giờ, vì vậy chỉ còn 11 giờ để đi! Hiện tượng AMD lõi tứ. Nó đang đạt được tiến bộ, đó là lý do tại sao tôi cho phép nó chạy (phần mở rộng thanh tiến trình hg là điều bắt buộc). Nó xen kẽ giữa việc gắn một CPU và hoàn toàn không sử dụng CPU và thực hiện nhiều truy cập đĩa.
David đưa ra

Có ai đã kiểm tra nếu hiệu suất kém gây ra bởi hggithoặc hgquá chậm để có thể sử dụng được với các dự án kích thước hạt nhân nói chung?
Mikko Rantalainen

1

Tôi đã thử git-hg của cosmingit-hg-một lần nữa trên cả repo hg của mutt , có vẻ như sau này tôn trọng thứ tự hợp nhất, trước đây là một chút ngẫu nhiên. Bạn có thể nhìn thấy từ các ảnh chụp màn hình dưới đây.

Biểu đồ lịch sử hợp nhất của mutt được nhập bởi git-hg của cosmin :

nhập mô tả hình ảnh ở đây

Biểu đồ lịch sử hợp nhất của mutt được nhập bởi gour-hg-abourget :

nhập mô tả hình ảnh ở đây

Biểu đồ lịch sử Actuall được vẽ bởi hgk trên kho hg của mutt:

nhập mô tả hình ảnh ở đây

Như bạn có thể thấy ở trên, biểu đồ thứ hai của git-hg-again của abourget rất gần với biểu đồ hgk ban đầu và thực sự phản ánh quy trình làm việc thực sự của mutt.

Một nhược điểm của git-hg-một lần nữa tôi thấy là nó không thêm điều khiển từ xa 'hg', mà nhập tất cả các ref của nó làm thẻ địa phương, git-hg có một điều khiển 'hg' tuyệt vời đại diện cho repo hg ngược dòng.


1
Dường như với tôi rằng sự khác biệt giữa các phiên bản của cosmin và abourget là thứ tự của cha mẹ trong các cam kết hợp nhất. Một công cụ trực quan lịch sử tốt (ví dụ gitk) sẽ có thể hiển thị cả hai lịch sử giống hệt nhau. Điều rõ ràng duy nhất còn thiếu là nhánh hg/stabletrong phiên bản bởi abourget. Tôi đoán đó là thứ nằm giữa các nhánh được đặt tên, các nhánh chưa được đặt tên và dấu trang trong Mercurial.
Mikko Rantalainen

0

Đồng bộ hóa hai chiều hg-git (và git-git, hg-hg) cũng có thể với dịch vụ Git-hg Mirror . Nó sử dụng hg-git (trong số những người khác) đằng sau hậu trường và mã của nó cũng là nguồn mở.


Tuyên bố miễn trừ trách nhiệm : Tôi đến từ công ty đằng sau nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.