2012-02-12 40 views
5

Cuối cùng tôi đã di chuyển kho CVS của chúng tôi sang git. Thật không may, chúng tôi đã không sử dụng các chi nhánh trong CVS nhưng các phiên bản/chi nhánh khác nhau được tách ra thành các thư mục con khác nhau.Tách thư mục trong kho git thành các nhánh riêng biệt

I.E. chúng tôi có cấu trúc thư mục sau:

/root 
    /lib 
    /tools 
    /src 
     /v1.0 
     /v2.0 
     /v3.5 

Có cách nào để tách 3 phiên bản trong thư mục con src thành các nhánh riêng biệt thay vì giữ thư mục cho mỗi phiên bản không?

Tôi đã tìm thấy cùng một câu hỏi ở đây trên Stack Overflow Question 4877053, nơi sử dụng git-subtree được đề xuất, nhưng ngay cả sau khi đọc hướng dẫn cho git-subtree, tôi không hiểu cách sử dụng nó để giải quyết vấn đề của tôi .

Ai đó có thể cho tôi giải thích chi tiết hơn hoặc thậm chí giải pháp khác không?

Tôi khá mới để git, có lẽ đó là lý do tại sao tôi không hiểu hướng dẫn subtree ;-)

Cảm ơn rất nhiều vì tất cả anwers của bạn!

+0

Bạn có lịch sử cam kết được liên kết với các thư mục phiên bản khác nhau không? Khi bạn di chuyển CVS repo sang git, bây giờ bạn có một lịch sử mà bạn muốn giữ không? Tôi khá chắc chắn rằng bạn có thể chia các thư mục đó bằng cách sử dụng kết hợp 'git filter-branch' và' git merge', nhưng khó có thể nói chắc chắn mà không biết bạn muốn giữ gì hoặc muốn kho lưu trữ cuối cùng như. – simont

Trả lời

3

Tùy thuộc vào những gì bạn muốn còn lại trong kho lưu trữ sau đó.

Nếu bạn muốn ba nhánh, v1.0, v2.0, v3.5, tất cả với cấu trúc như thế này:

/root 
    /lib 
    /tools 
    /src 

thì vâng, tôi khá chắc chắn rằng bạn có thể làm điều đó. Bạn sẽ kết thúc với một cái gì đó như thế này về mặt cấu trúc chi nhánh:

-- A -- B -- Current 
       | 
       |--- v1.0 
       |--- v2.0 
       |--- v3.5 

A, B, Current phúc cam kết mà bạn đã cam kết kể từ khi bạn di chuyển đến git, và nơi v1.0, v2.0v3.5 cơ bản là "chết -end "cành". Bạn có thể làm một số việc ưa thích nếu bạn muốn có được một cấu trúc chi nhánh như hơn:

-- v1.0 --- v2.0 --- v3.5 -- A -- B -- Current 

Đó là, riêng v1.0, v2.0, và v3.5 vào ngành mình phụ trách, sau đó rebase v1.0 vào v2.0, v2.0 vào v3.5, và v3.5 vào cam kết đầu tiên trong phiên bản hiện tại.

Nhưng tôi không chắc chắn chính xác những gì bạn muốn làm.


Có cách nào để tách 3 phiên bản trong thư mục con src vào chi nhánh riêng biệt thay vì giữ thư mục cho mỗi phiên bản?

Vâng, tôi chắc chắn bạn có thể thực hiện việc này. Phương pháp của tôi là một chút ... phức tạp, tôi sẽ thừa nhận, nhưng ở đây đi. Vui lòng, hãy cẩn thận và đọc các trang hướng dẫn sử dụng - các lệnh sau có thể sẽ không làm hỏng mọi thứ nhưng bạn tự chịu rủi ro.

  1. git checkout -b v1.0 - chuyển vào nhánh mới.
  2. Xóa mọi thứ ngoại trừ v1.0. Có một số cách để làm điều này. Câu hỏi này có một số phương pháp để loại bỏ tất cả mọi thứ ngoại trừ; Tôi không thể làm cho họ làm việc cho tôi, nó có thể làm việc tốt hơn cho bạn.

    `git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch src/v2.0" --prune-empty -f` 
    

    này sẽ loại bỏ src/v2.0và tất cả lịch sử liên quan đến từ chi nhánh. -f không cần thiết cho bộ lọc này; nhưng git-filter-branch có một số loại sao lưu (đọc trang người đàn ông?) và nó có thể nhổ lỗi. Nó chắc chắn sẽ lần thứ hai bạn thử git filter-branch.

    Lặp lại thao tác này để xóa src/v3.5.

    Điều này sẽ để lại cho bạn src/v1.0. Bạn có thể muốn chuyển nguồn từ src/v1.0 thành src; bạn có thể chạy git filter-branch --subdirectory-filter (đọc trang người đàn ông) để giúp bạn cấu trúc thư mục /v1.0-files (không chứa gì ngoài các tệp từ thư mục con v1.0; đã di chuyển nội dung từ v1.0 đến root), sau đó xem các ví dụ trong trang man git-filter-branch (cụ thể là ví dụ dưới) để chuyển các tệp vào thư mục con. Điều đó có thể quá mức cần thiết và sau đó bạn cần phải hợp nhất rằng vào chi nhánh có chứa tất cả các nội dung khác mà số git filter-branch --subdirectory đã chọn; một đơn giản mv v1.0/* . có thể hoạt động, nhưng sau đó bạn sẽ có một cam kết khác trong lịch sử của bạn. Tôi không biết những gì bạn thích.

    Vì vậy, bây giờ bạn đã có v1.0 trong chi nhánh riêng của nó. Yay!

  3. Lặp lại cho v2.0v3.5.

Tôi sợ rằng tôi không thể thấy điều này làm bất cứ điều gì nhưng cho bạn ... lịch sử "kỳ quặc". Có lẽ, v2.0, về cơ bản, v1.0 + các cải tiến; cấu trúc mà tôi đã liệt kê ở trên (ba nhánh "kết thúc") hiển thị v2.0v3.5 không được xây dựng trên các phiên bản trước. Tôi không hoàn toàn chắc chắn loại history nào bạn có, nếu điều này là một vấn đề, vv vv

Bởi vì bạn đã có v1.0, v2.0v3.5 tại các chi nhánh nhỏ của riêng mình, bạn có thể git merge họ hoặc git rebase vv vv , nếu bạn thích lịch sử đẹp hơn.

Hy vọng điều này mang đến cho bạn một chút suy nghĩ; như tôi đã nói, vui lòng đọc trang hướng dẫn sử dụng. :)

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