2010-03-29 35 views
31

Giả kho git của tôi có cấu trúc sau:Trích xuất một phần của kho lưu trữ git?

/.git 
/Project 
/Project/SubProject-0 
/Project/SubProject-1 
/Project/SubProject-2 

và kho có khá một số cam kết. Bây giờ một trong các tiểu dự án (SubProject-0) phát triển khá lớn, và tôi muốn đưa SubProject-0 ra và thiết lập nó như là một dự án độc lập. Có thể trích xuất tất cả lịch sử cam kết liên quan đến SubProject-0 từ kho lưu trữ git mẹ và chuyển nó sang một tệp mới không?

+2

Lưu ý rằng đây là bản sao của http://stackoverflow.com/questions/359424/detach-subdirectory-into-separate-git-repository (như Jim DeLaHunt nói trong câu trả lời của mình). –

Trả lời

36

Xem http://git-scm.com/docs/git-filter-branch

tôi nghĩ rằng bạn cần một cái gì đó giống như

git filter-branch --subdirectory-filter Project/SubProject-0 --prune-empty -- --all 

trong một bản sao của kho.

+0

Cảm ơn! Làm việc như một say mê! – Rio

+2

@Rio Bạn cũng có thể muốn sử dụng tùy chọn '--prune-empty' để xóa các cam kết chỉ chạm vào' Project/SubProject-0'. –

+0

wow hoạt động hoàn hảo! cảm ơn – alvatar

1

Tôi cần phải làm điều gì đó tương tự, nhưng tôi muốn cơ bản di chuyển một tiểu dự án từ repo này sang repo khác. Những gì tôi đã làm thay vào đó là sử dụng tìm nạp, vì nó có thể lấy các đối tượng từ bất kỳ nguồn nào. Vì vậy, về cơ bản, tôi đã tạo ra một chi nhánh mới, xóa những thứ không cần thiết trong nhánh đó, sau đó sử dụng git fetch để kéo nhánh từ repo này sang repo khác. Một khi tôi đã có các đối tượng, hợp nhất đã làm các trick.

Ví dụ:

Trên kho có những thứ ban đầu:

git checkout -b temp master 
    git rm -r Unneeded_stuff 
    git commit -m 'pruning' 

Sau đó, bạn có thể lấy mà chi nhánh từ một kho lưu trữ vào một hoàn toàn khác nhau (không liên quan):

cd /path/to/other/repository 
    git fetch /path/to/source/repo temp:temp 

nơi tạm: tạm thời phương tiện "tìm nạp temp trên nguồn và lưu nó dưới dạng temp ở đây". Từ đó bạn có thể hợp nhất kết quả vào tổng thể của bạn.

git merge temp 

Sau đó, bạn có thể xóa các nhánh tạm thời, vì trong trường hợp đầu tiên nó không phải là thứ bạn muốn kết hợp với repo gốc và trong trường hợp thứ hai bạn đã hợp nhất.

Tôi chắc chắn các bước này có thể được nén một chút, nhưng bộ này có vẻ đẹp và rõ ràng.

+0

Xin lỗi vì đã lỗi bạn về một bài đăng cũ, nhưng điều này trả lời một câu hỏi hữu ích nhưng khác với OP. Bạn có thể tạo cặp q/a mới cho câu trả lời này không? Nó sẽ làm cho nó dễ dàng hơn nhiều để tìm thấy. – tacaswell

+0

và sẽ tốt hơn nếu sử dụng phương pháp lọc để tạo một kho lưu trữ tạm thời chỉ bao gồm các tệp bạn muốn di chuyển và sau đó thực hiện bước hợp nhất khỏi kho lưu trữ tạm thời như làm theo cách này vẫn có lịch sử đầy đủ của repo gốc (chỉ với một bước xóa như cam kết cuối cùng). – tacaswell

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