2012-09-25 33 views
6

Làm theo câu hỏi của tôi Git subtree export and re-import woes Tôi muốn hỏi cách chuyển đổi thư mục thành cây con.Tạo thư mục hiện có một git subtree

Hãy tưởng tượng tôi có kho lưu trữ A nơi tôi có mã mà bây giờ sẽ được chia sẻ với một dự án khác (và có thể nhiều hơn), vì vậy tôi đặt tất cả mã được chia sẻ trong thư mục "phụ". Thư mục này bây giờ nên được trích xuất (không có lịch sử nếu có thể) để kho trần C. Sau đó "phụ" nên trở thành một cây con từ C, tuy nhiên mà không làm mất lịch sử trong A (rất quan trọng). Tôi cũng muốn có thể thực hiện thay đổi trong "phụ" và đẩy những thay đổi này vào C.

Trả lời

7

git subtree split thực hiện chính xác điều đó. Cho một thư mục thông qua --prefix nó sẽ tạo ra một cây riêng biệt trong bạn repo mà bạn có thể đẩy đến một kho lưu trữ và sau đó sử dụng như bạn thấy phù hợp.

Phiên bản hiện tại của git (1.8.1) không bao gồm tài liệu cây con, nhưng bạn có thể tìm thấy nó ở đây: https://github.com/apenwarr/git-subtree/blob/master/git-subtree.txt

Dòng chảy bạn có thể sử dụng là:

# In Repo A create your subtree split and push it 
> git subtree split --prefix sub --branch subBranch 
> git push C subBranch:master 

# After some changes that touched the sub directory 
> git subtree push --prefix sub C master 

cuối cùng lệnh wil tái phân chia cây (sử dụng các cam kết đã tách trước đó để duy trì tính nguyên vẹn của cây C) và đẩy nó đến C/master.

Nếu bạn muốn loại bỏ lịch sử đến nội dung đẩy lên C bạn có thể sử dụng tùy chọn --squash khi git split -ing và git push -ing. Bạn phải nhất quán và tiếp tục sử dụng nó về phía trước, vì nếu bạn bắt đầu trộn lẫn, nội dung không bị đè bẹp sẽ không thể chia nhỏ và sử dụng lại các phần chia nhỏ, và do đó bạn sẽ không thể đẩy nó đến C.

Cuối cùng, khi bạn đã tạo phần tách đầu tiên là sub, bạn không cần phải xóa hoàn toàn và nhập lại nó dưới dạng một cây con mới. Nếu bạn giữ nó git subtree sẽ chỉ tạo lại/sử dụng lại các cam kết đã tạo trước đó từ các phần tách khác. Nếu bạn xóa thư mục và sau đó thêm lại sub từ các cam kết đã tạo thì nó vẫn hoạt động và nếu bạn đang sử dụng --squash, nó sẽ khớp với những gì bạn muốn với C không có lịch sử, nhưng giữ lịch sử A).

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