2009-10-20 17 views
27

Tôi có kho lưu trữ git này chứa hai thư mục: binary-searchpoker. Ví dụ: http://github.com/soulnafein/code-katasLàm thế nào để tạo một phần của kho lưu trữ GIT hiện có là mô-đun con

Tôi muốn đặt các thư mục này thành các mô-đun con và giữ lịch sử thay đổi của chúng.

Tôi có thể làm như thế nào?

+1

bản sao có thể có của [Làm thế nào để trích xuất một thư mục con git và tạo một mô-đun con ra khỏi nó?] (Http://stackoverflow.com/questions/920165/howto-extract-a-git-subdirectory-and-make-a- submodule-out-of-it) –

+0

có thể trùng lặp của [Tách thư mục con vào kho lưu trữ Git riêng biệt] (http: // stackoverflow.com/questions/359424/detach-subdirectory-into-individual-git-repository) –

Trả lời

14

Ý tưởng chung là sử dụng 'git filter-branch' và các bước sau:

1) Tạo một submodule sử dụng --subdirectory lọc của filter-branch (sau khi nhân bản repo của bạn).

$ git filter-branch --subdirectory-filter ABC HEAD -- --all 

Xem này SO question để biết thêm về bước này.

2) Tạo siêu trình chiếu bằng bộ lọc chỉ mục filter-branch để xóa mô-đun con.

$ git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch ABC" --prune-empty HEAD 

3) Cam kết mô-đun con về phiên bản mới nhất của siêu dự án.

Xem Detach subdirectory into separate git repository để biết ví dụ thực tế.

Mỗi mô-đun con sẽ giữ lại lịch sử của nó.
Nhưng như đã nói ở patch proposal này, nó sẽ:

mất tất cả các kết nối lịch sử giữa superproject và submodule, công cụ phá vỡ như 'git bisect', và làm cho nó khó khăn để khôi phục lại phiên bản cũ.

Lý tưởng nhất, mỗi phiên bản của superproject mới được tạo ra sẽ được liên kết với các phiên bản đúng của submodule (và tất cả các mục .gitmodules sẽ được thiết lập một cách chính xác, quá, trong suốt lịch sử của dự án)

Nếu bạn không cần phải có lịch sử trước đó liên kết với các mô-đun con mới, bạn có thể làm theo các bước được đề cập ở trên.
Nhưng nếu bạn cần phải chi nhánh từ một điểm cũ hơn trong khi có tham chiếu đến submodules của bạn (mà hiện nay là tiểu thư mục đơn giản), bạn có thể xem xét thử kịch bản được đề cập trong bản vá tôi đề cập đến. Nó được thảo luận trong this thread, nhưng tích hợp để Git nêu ra, như Junio ​​C Hamano nói:

Thật không may, tôi không nghĩ rằng chúng tôi đã thiết kế đầy đủ (và cũng không thực hiện ở tất cả) hành vi để kiểm tra các điểm khác nhau của lịch sử mà có cùng một submodule di chuyển xung quanh trong cây superproject.

14

Hôm nay có một cách tốt hơn để làm điều này: git subtree

Xem this answer.

+0

Rõ ràng, ['git subtree' được hợp nhất thành git chính] (https://github.com/apenwarr/git-subtree/blob/master/NÀY-REPO-IS-OBSOLETE) kể từ phiên bản 1.7.11. – donut

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