2010-01-20 31 views
7

Tôi muốn chuyển đổi một kho lưu trữ từ Subversion sang Mercurial, nhưng khi tôi thiết lập kho lưu trữ ban đầu, tôi đã làm nó theo cách lười nhất có thể. Theo thời gian, cấu trúc tiếp tục biến dạng và xấu đi (đó là 5 tuổi vào thời điểm này). Tuy nhiên, tôi muốn bảo tồn càng nhiều lịch sử càng tốt, ngay cả khi tôi phải lấy những thứ bẩn và thủ công lại với nhau.Cách di chuyển từ Subversion sang Mercurial khi cấu trúc trunk/branch/tag là một mớ hỗn độn?

Nếu không có thêm ado, cấu trúc hiện tại trông giống như vậy:

svn://svn.example.com/Example 
    + trunk 
     + BigProject 
     + BinaryDepedencies 
    + branches 
     + BigProject 
      + branch1 
      + feature1 
      + maintenance1 
      + ... 
    + tags 
     + BigProject 
      + tag1 
      + tag2 
      + ... 
    + projects 
     + small_project1 
     + small_project2 
     + small_project3 
     + ... 

Cho rằng đây chỉ là cấu trúc gần đây nhất, là còn hi vọng cho kho lưu trữ này? Nếu không có hy vọng, bất cứ ai có một cách tiếp cận tốt để xây dựng lại lịch sử bằng tay trong Mercurial (hoặc bazaar).

Ngoài ra, vì nhiều lý do, tôi sẽ không thể sử dụng git trừ khi có một chiến lược chống đạn để chuyển đổi repo cụ thể này từ Subversion thành git thành hg/bzr.

+0

Sẽ có một câu trả lời hay cho điều này sớm thôi. reposurgeon đang phát triển khả năng nhập khẩu Subversion, và có vẻ như rất nhiều sự quan tâm và chú ý đang được trả cho khả năng này: http://esr.ibiblio.org/?p=4071 – Omnifarious

Trả lời

7

Một chiến lược có thể là chuyển đổi thân cây. Bạn có thể phải chơi một số trò chơi nếu thân cây của bạn đã di chuyển, nhưng nó không phải là quá khó.

Một công cụ khác trong kho vũ khí của bạn có thể là chuyển đổi hg-> hg và phần mở rộng rebase. Bạn có thể sử dụng những thứ đó để giải quyết với cây của bạn sau khi bạn có những thứ trong kho lưu trữ hg và ghép trên cành sau khi bạn đã chuyển đổi chúng. Hoặc ghép trong các mảnh mới của lịch sử thân cây của bạn sau khi di chuyển của nó.

Đây là liên kết tốt đẹp đến tài liệu trên Mercurial rebase extension.

Về cơ bản, đây là chiến lược bạn sẽ làm theo ... Trước tiên, hãy sử dụng convert extension hoặc hgsvn để chuyển đổi các phần của kho lưu trữ. Điều này có thể dẫn đến nhiều dòng trunk, hoặc trong các nhánh nằm trong một kho lưu trữ riêng biệt từ đường chính.

Nếu bạn có hai bộ phận của thân cây trong kho riêng biệt và một trong các thư mục gọi là second trực tiếp theo một trong các thư mục gọi là first, bạn có thể làm điều này:

cd second 
hg log -r 0 
# Note the revision hash 
cd ../first 
hg tip 
# Again, note the revision hash 
hg pull -f ../second 
hg rebase --source <revision hash from hg log -r 0> --dest <revision hash from hg tip> 

Điều đó sẽ ghép một phần của trunk lên một phần khác của thân cây.

Nếu bạn có một chi nhánh tại một kho riêng biệt, các thủ tục là hơi phức tạp hơn:

cd branch 
hg log -r 0 
# Note the revision hash 
cd ../trunk 
# Find the revision that the branch branches off from and note its hash. 
# We will call this revision the 'branch base'. 
hg pull -f ../branch 
hg rebase --source <revision hash from hg log -r 0> --dest <revision hash of branch base> 

Điều đó sẽ ghép các chi nhánh vào cây trồng chính.

+0

Bạn có thể giải thích làm thế nào để ghép cành? Ý tưởng hg-> hg có vẻ đầy hứa hẹn. – user255063

+0

@throttled - Ở đó, tôi đã cố gắng giải thích thêm. :-) – Omnifarious

+0

Tuyệt vời, cảm ơn bạn. Điều đó cho tôi một chút để nhai. – user255063

3

Theo số convert extension's docs, một số thứ như sau sẽ hoạt động.

$ cat > ~/.hgrc <<EOF 
[extensions] 
hgext.convert= 
EOF 
$ hg convert --config convert.svn.trunk trunk/BigProject --config convert.svn.branches branches/BigProject --config convert.svn.tags tags/BigProject svn://svn.example.com/Example newhgrepo 
+1

Đề xuất rất hay, có vẻ như tôi có thể thử sử dụng cùng một chiến lược để tách các dự án nhỏ thành repo của riêng họ. – user255063

Các vấn đề liên quan