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
).