2012-05-04 19 views
24

Tôi có 3 repos, A, B và C, tất cả đều liên quan đến cùng một dự án. A là phiên bản cũ nhất của dự án, B là một thử nghiệm không thực sự đi bất cứ đâu và C là phiên bản làm việc mới nhất. Tất cả các repos này có các tệp khác nhau - chúng là các triển khai khác nhau của cùng một sản phẩm.Hợp nhất hai kho lưu trữ khác nhau

Tôi muốn hợp nhất 3 repos này thành một bản lưu giữ lịch sử của họ - điều này rất quan trọng. Tôi đoán tôi muốn ngăn xếp B trên đầu trang của A và C trên đầu trang của B nhưng khi tôi kiểm tra dự án tôi chỉ muốn nhận các thay đổi liên quan đến repo C.

Ý tưởng của tôi là gắn thẻ hoặc tạo chi nhánh có tên trên A, hg rm *, cam kết và sau đó chồng B lên trên. Lặp lại cùng với B vì vậy tôi có thể đống C và sau đó tiếp tục dự án như bình thường.

Bạn nghĩ sao? Ngoài ra, một số nguồn cảm hứng cho những gì tôi muốn làm: 1, 2.

+3

Bản sao có thể có của http://stackoverflow.com/q/12843/950708 – andruso

Trả lời

30

Bạn chỉ có thể kéo các thay đổi vào một kho lưu trữ lớn. Bắt đầu với một repo:

$ hg init combined 
$ cd combined 
$ hg pull ../A 
$ hg update 

Sau đó buộc phải kéo trong B và giả-hợp nhất hai người đứng đầu để bạn giữ các tập tin từ B:

$ hg pull ../B --force 
$ hg merge --tool internal:other 
$ hg revert --all --rev tip 
$ hg commit -m "Merge A and B, kept B" 

Sau đó lặp lại cho C:

$ hg pull ../C --force 
$ hg merge --tool internal:other 
$ hg revert --all --rev tip 
$ hg commit -m "Merge B and C, kept C" 

Điều đó cung cấp cho bạn ba dòng lịch sử và điểm hợp nhất nơi bạn đầu tiên vứt bỏ A, rồi đến B và cuối cùng kết thúc bằng C.

Hoặc bạn có thể sử dụng convert extension với bản đồ mối nối để ghép ba lịch sử lại với nhau. Bắt đầu bằng cách buộc kéo tất cả các changeset vào một kho lưu trữ duy nhất. Sau đó, chuyển đổi Mercurial thành Mercurial, nơi bạn thêm đầu của A làm cha mẹ đầu tiên của gốc B. Tương tự với B và C. Điều đó mang lại cho bạn một lịch sử lâu dài, nơi sẽ có một thay đổi rất đột ngột khi bạn đi từ A đến B và từ B đến C.

Tôi sẽ đi với tùy chọn đầu tiên: đó là điều rõ ràng nhất và hiển thị tốt nhất những gì sẽ xảy ra mà không cần giả mạo (chuyển đổi) lịch sử.

+0

Khi tôi hg hoàn nguyên - tất cả mẹo cho lần đầu tiên nó hủy hợp nhất không được cam kết mà không có sửa đổi được chỉ định. – ruipacheco

+0

@Cocoaster: xin lỗi về điều đó, tôi đã quên một '--rev' trong lệnh. Tôi đã viết lại với một lệnh tốt hơn. –

+0

Ngoài ra, bạn có thiếu một "mẹo cập nhật hg" cho C không? – ruipacheco