Mặc dù liên quan đến hai phụ, tôi yêu cầu này như là một câu hỏi kết hợp bởi vì cách nó được chia thành các phần không phải là những gì quan trọng. Tôi mở ra những cách khác nhau để đạt được những gì tôi muốn miễn là kết quả cuối cùng giữ lại tất cả lịch sử có ý nghĩa và khả năng kiểm tra, nghiên cứu và xây dựng/thử nghiệm các phiên bản lịch sử. Mục tiêu là để nghỉ hưu hg và mô hình subrepo đã được sử dụng cho đến nay và di chuyển đến một cây thống nhất trong git, nhưng không hy sinh lịch sử.hg để git chuyển đổi và subrepo hợp nhất
Tôi đang bắt đầu với một kho lưu trữ Mercurial bao gồm một số mã cấp cao nhất và một số phân đoạn phụ mà phần lớn lịch sử thú vị nằm. Các subrepos có một số phân nhánh/sáp nhập, nhưng không có gì quá điên rồ. Kết quả cuối cùng tôi muốn đạt được là một kho git duy nhất, không có các môđun con, chẳng hạn rằng:
Đối với mỗi cam kết trong bản gốc top-level repo hg, có một git commit để kiểm tra ra giống hệt nhau cây như bạn muốn kiểm tra ra hg tương ứng cam kết với tất cả các cam kết subrepo tham chiếu của nó.
Các cam kết git này tương ứng với các cam kết hg cấp cao nhất liên tiếp là hậu duệ của nhau, với các cam kết tương ứng với tất cả các cam kết phụ có liên quan ở giữa.
Ý tưởng cơ bản tôi đã cho làm thế nào để đạt được điều này là để lặp qua tất cả các cấp cao nhất hg cam kết, và đối với mỗi cấp cao nhất cam kết rằng những thay đổi .hgsubstate
, cũng lặp qua tất cả các đường dẫn từ phiên bản cũ sang sửa đổi mới cho submodule (có thể liên quan đến phân nhánh). Tại mỗi bước:
- Kiểm tra bản sửa đổi hg phù hợp cho cấp cao nhất và tất cả các phân mục phụ.
- Xóa mọi thứ khỏi chỉ mục git.
- Giai đoạn mọi thứ được kiểm tra từ hg đến chỉ mục git.
- Sử dụng
git-write-tree
vàgit-commit-tree
để tạo cam kết với cha mẹ mong muốn, sử dụng quyền tác giả, ngày tháng và thư cam kết từ cam kết hg tương ứng. - Ghi lại sự tương ứng giữa cam kết git mới và hg để sử dụng trong việc tạo ra cha mẹ của các cam kết trong tương lai.
Công việc này có nên không? Có cách nào tốt hơn để đạt được những gì tôi muốn, có lẽ làm sụp đổ subrepo với hg đầu tiên? Điều lớn nhất tôi không rõ ràng là làm thế nào để thực hiện lặp đi lặp lại mong muốn, vì vậy lời khuyên thiết thực cho làm thế nào để đạt được nó sẽ là tuyệt vời.
Một hạn chế bổ sung: bản gốc có liên quan đến nội dung không thể xuất bản (bước bổ sung git-filter-branch
sau khi chuyển đổi cơ bản được thực hiện) để các giải pháp liên quan đến việc tải lên repo để xử lý bởi bên thứ ba là không khả thi.
Dường như với tôi như 'git fast-import' đã được tạo cho các công việc như thế này. – jthill
@jthill: Bạn có thể xây dựng được không? Tôi không thấy bất cứ điều gì về việc sử dụng nó để hợp nhất lịch sử subrepo mà là một nhiệm vụ rất phi thường ngay cả ở mức cao. –
Điều cần hiểu là, dag cam kết lịch sử là tất cả có. Nó không phải là một trừu tượng, và không có trạng thái toàn cầu. Bạn có thể sử dụng '.hgsubs' và' .hgsubstate' để tìm các phân đoạn con và nhập đệ quy chúng vào kho lưu trữ git chính của bạn, bắt đầu từ ví dụ: 'hg manifest --debug' đầu ra. Một khi bạn đã có tất cả chúng trong một repo git, bạn có thể xây dựng lịch sử bổ sung tùy ý bất kỳ cách nào bạn muốn. Điều này sẽ nhanh hơn rất nhiều so với các thao tác đọc cây/viết-cây. Việc xây dựng cần thiết tại thời điểm đó chỉ là chính xác những gì bạn muốn làm lịch sử kết quả của bạn? – jthill