2010-02-24 30 views
10

tôi có các thiết lập dự án sau:Tái sử dụng một phần của một Repository git

  • Solution A
    • Project 1 (một thành phần nhẹ)
    • Project 2 (chứa rất nhiều các tập tin và phụ thuộc vào Project 1)

Solution A là một kho git duy nhất. Sau đó, tôi tạo ra một giải pháp khác và thấy rằng tôi có thể tái sử dụng và thậm chí cập nhật chức năng của Project 1. Vì vậy, giải pháp thứ hai của tôi có lẽ sẽ giống như thế này:

  • Solution B
    • Project 1 (phải được chia sẻ!)
    • Project 3 (phụ thuộc vào Project 1).

Bây giờ tôi muốn Project 1 để trở thành một thành phần chia sẻ. Tức là, mỗi khi tôi thay đổi mã nguồn của Project 1 từ một trong hai giải pháp (A hoặc B), tôi cần một mã nguồn khác để cập nhật cho phù hợp.

Có thể điều này có liên quan đến tính năng submodule tính năng git. Tuy nhiên, cách duy nhất tôi có thể sử dụng nó là chỉ định toàn bộ Solution A làm mô-đun con cho Solution B. Đây không thực sự là điều tôi muốn lý tưởng vì kích thước to lớn của Solution A. Tôi chỉ cần một phần nhỏ của nó là một submodule.

Tôi biết rằng có thể trong svn và hoạt động chính xác như tôi đã mô tả: bạn chỉ định thư mục trong kho lưu trữ bên ngoài trong thuộc tính svn:externals.

Mọi mẹo về điều đó? Hoặc có thể, tôi đang thiếu một cái gì đó?

Trả lời

7

này chắc chắn liên quan đến submodules (xem nature of submodules)

Trong trường hợp của bạn, giải pháp lý tưởng sẽ là để trích xuất Project1 từ SolutionA Git repo:
Xem How to extract a git subdirectory and make a submodule out of it?.

Nhưng điều đó liên quan đến việc viết lại lịch sử SolutionA, đó là một vấn đề nếu bạn đã xuất bản nó và nếu một số người đang kéo nó ra.

Sử dụng filter-branch cho quy trình trích xuất.

Để viết lại kho để trông như thể Project1/ đã gốc dự án của mình, và loại bỏ tất cả lịch sử khác:

git filter-branch --subdirectory-filter Project1 -- --all 

Vì vậy bạn có thể, ví dụ, biến một thư mục con thư viện thành một kho lưu trữ của riêng nó. Lưu ý rằng -- tách các tùy chọn filter-branch khỏi các tùy chọn sửa đổi và --all để viết lại tất cả các chi nhánh và thẻ.

Sau đó tuyên bố Project1 như một submodule trong SolutionB:

cd SolutionB 
git submodule add /path/to/Project1 Project1 

LƯU Ý: Không sử dụng các URL địa phương ở đây nếu bạn có kế hoạch xuất bản SolutionB của bạn!

git commit -m "Add submodules Project1" 
0

Chia Dự án 1 ra kho riêng của mình, và làm cho nó một submodule của cả hai giải pháp A và Giải pháp B.

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