2009-05-01 38 views
109

Tôi đã thừa kế một kho chứa git chứa nhiều dự án trong các thư mục riêng biệt. Tôi muốn chia kho lưu trữ thành các kho lưu trữ riêng lẻ mới, một cho mỗi dự án và sau đó có kho lưu trữ chính chứa các dự án như các mô-đun con. Tôi muốn làm tất cả điều này trong khi duy trì lịch sử sửa đổi của các dự án riêng lẻ nếu có thể.Làm cách nào để di chuyển một thư mục từ kho lưu trữ git sang kho lưu trữ mới trong khi vẫn duy trì lịch sử?

Tôi có thể sao chép kho lưu trữ cho từng dự án và loại bỏ tất cả các dự án khác mỗi lần, nhưng có cách nào tốt hơn để tránh có lịch sử nhân bản trong mỗi kho dự án mới không?

+2

Added git-submodules thẻ vì đây là rất hữu ích để chuyển đổi một phần của một repo thành một submodule. – idbrii

+0

Có thể trùng lặp của [Xuất subtree trong Git với lịch sử] (http://stackoverflow.com/questions/1662753/export-subtree-in-git-with-history) – user

Trả lời

97

Bạn có thể sử dụng git filter-branch để viết lại lịch sử của dự án. Từ các tài liệu:

Để viết lại kho để trông như nếu foodir/đã 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 foodir -- --all 

Make nhiều bản sao của repo của bạn, làm điều đó cho mỗi thư mục con bạn muốn tách ra, và bạn nên kết thúc với những gì bạn đang tìm kiếm.

+0

bằng cách làm điều này, điều này có bắt đầu repo mới như thể không có lịch sử gì không? đó là những gì tôi đang thu thập từ tài liệu. – hellatan

+0

@dtan Repo mới sẽ có tất cả lịch sử ảnh hưởng đến thư mục 'foodir /', nhưng không có lịch sử nào ảnh hưởng đến bất kỳ thứ gì khác trong repo. Vì vậy, nếu bạn có bốn thư mục con, mỗi thư mục trong số đó là các dự án riêng biệt và chạy 'git filter-branch' trên mỗi dự án, mỗi thư mục sẽ chỉ có lịch sử ảnh hưởng đến thư mục con đó. –

+1

Nếu tôi muốn * loại trừ * foodir và xóa tất cả lịch sử của nó thì sao? – saeedgnu

1

Điểm của git là lịch sử được thể hiện trong mỗi cam kết bằng cách bẻ gãy phụ huynh cam kết. Bạn có thể "phát lại" các cam kết (đây chủ yếu là cách trình nhập khẩu svn hoạt động) vào một kho lưu trữ mới và chỉ giữ từng tiểu dự án. Điều này, tuy nhiên, sẽ phá hủy ý nghĩa của băm cam kết. Nếu bạn không có vấn đề với điều đó thì hãy là vậy.

Trong quá khứ tôi vừa nhân bản nó và tiếp tục. Điều này làm cho mọi thứ lớn hơn nhưng không gian đĩa là rẻ; thời gian của tôi là tốn kém.

Tôi cũng không biết bất kỳ công cụ nào để ghép nối một thư mục. Tôi cho rằng bạn có thể git-log vào thư mục để tìm tất cả các cam kết trên nó sau đó phát lại các cam kết với một cái gì đó như git-nhanh-xuất khẩu?

+0

Tôi upvoted vì điều này bởi vì không xứng đáng được tiêu cực - Tôi chắc chắn sẽ không làm theo cách tiếp cận này nhưng có thể thấy anh ta đang cố gắng – Alvin

1

Để xuất một thư mục như một kho lưu trữ mới, bạn cần:

  1. Để clone kho nơi thư mục mà bạn muốn xuất là.
  2. Để tạo kho lưu trữ trống trên nhà cung cấp dịch vụ lưu trữ của bạn dưới dạng GitHub, để lưu trữ thư mục đã xuất.
  3. Mở thư mục nhân bản kho lưu trữ và chạy lệnh này:

    git subtree push --prefix=YourFolderNameToExport https://github.com/YourUserName/YourNewCleanRepoName master 
    
Các vấn đề liên quan