2012-03-20 20 views
9

Tôi có hai không liên quan (không chia sẻ bất kỳ tổ tiên nào kiểm tra) Git repositories, một là một kho lưu trữ siêu bao gồm một số dự án nhỏ hơn (Cho phép gọi nó là kho A). Một cái khác chỉ là một kho lưu trữ Git cục bộ tạm thời cho một dự án nhỏ hơn (cho phép gọi nó là kho lưu trữ B). Đồ họa, nó sẽ trông như thế nàyLàm thế nào để kết hợp hai kho lưu trữ Git không liên quan với nhau với một lịch sử đơn

A0-B0-C0-D0-E0-F0-G0-HEAD (repo A) 
A0-B0-C0-D0-E0-F0-G0-HEAD (remote/master bare repo pulled & pushed from repo A) 
A1-B1-C1-D1-E1-HEAD (repo B) 

Lý tưởng nhất, tôi thực sự muốn hợp nhất repo B vào repo A với một lịch sử duy nhất. Vì vậy, có thể thấy rằng tôi bắt đầu dự án tại repo A. Về mặt đồ họa, đây sẽ là kết quả cuối cùng lý tưởng

A0-A1-B1-B0-D1-C0-D0-E0-F0-G0-E1-H(from repo B)-HEAD (new repo A) 
A0-A1-B1-B0-D1-C0-D0-E0-F0-G0-E1-H(from repo B)-HEAD (remote/master bare repo pulled & pushed from repo A) 

tôi đã và đang làm một số đọc với các môđun con và cây con (Pro Git là một cuốn sách khá tốt bằng cách này), nhưng cả hai dường như để phục vụ giải pháp hướng tới việc duy trì hai nhánh riêng biệt với mô-đun phụ có thể kéo những thay đổi từ thượng lưu và cây con bị đau đầu ít hơn một chút. Cả hai giải pháp đều yêu cầu các lệnh git bổ sung và chuyên biệt để xử lý việc kiểm tra và đồng bộ hóa giữa nhánh cây con và nhánh phụ. Cả hai giải pháp cũng dẫn đến nhiều thời gian (với subtree bạn thậm chí có được 3 thời gian riêng biệt khi sử dụng --squash).

Giải pháp gần nhất từ ​​SO dường như nói về "graft", nhưng thực sự là nó? Mục đích là để có một kho lưu trữ thống nhất duy nhất mà tôi có thể kéo/đẩy đăng ký, để không có thêm repo B, chỉ cần repo A cuối cùng.

+0

thể trùng lặp của [Làm thế nào để bạn hợp nhất hai kho git?] (Http://stackoverflow.com/questions/1425892/how-do-you-merge-two-git-repositories) –

+0

@MichaelDurrant Không, tôi từ chối giải pháp subtree & submodule vì kịch bản không giống nhau – Antony

Trả lời

5

Tôi nghĩ rằng bạn làm điều đó như thế này:

  1. git remote thêm [repo b]
  2. git fetch // lấy repo b vào repo một
  3. do bạn muốn giữ lại lịch sử như thế này: A0-A1-B1-B0-D1-C0-D0-E0-F0-G0-E1-H (từ repo B) -HEAD (repo A mới) trước tiên bạn có thể chọn A0 làm điểm bắt đầu , sau đó, sử dụng git cherry-pick từng cái một.

Hy vọng điều này hữu ích cho bạn.

Br, Tim

+0

Kết hợp giải pháp của bạn cùng với hướng dẫn này @ http://gbayer.com/development/moving-files-from-one-git-repository- to-another-preserving-history /, nó hoạt động! – Antony

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