2009-03-05 39 views
35

Tôi có hai thư mục con đều có một repo, như sau:Tôi có thể di chuyển thư mục .git cho một repo vào thư mục chính của nó không?

PPP/ 
|--ABC/ 
| |--.git/ 
| |--AAA/ 
| | BBB/ 
| | CCC/ 
| 
|--DEF/ 
| |--.git/ 
| |--DDD/ 
| |--EEE/ 

Và muốn kết hợp chúng thành một repo, vì vậy, tôi sẽ giả định cấu trúc thư mục sẽ là như thế này:

PPP/ 
|--.git/ 
|--ABC/ 
| |--AAA/ 
| |--BBB/ 
| |--CCC/ 
| 
|--DEF/ 
| |--DDD/ 
| |--EEE/ 

Điều này có hữu ích không?

Hiện tại, một số người có repos trên máy của họ. Làm thế nào phức tạp hơn mà làm cho cuộc sống?

Ta.

+0

Xem [Kết hợp nhiều kho lưu trữ git] (http://stackoverflow.com/questions/277029/combining-multiple-git-repositories). –

Trả lời

42

Bạn có thể làm những gì bạn đang mô tả như thế này:

  1. Move nội dung của ABC đến một thư mục con ABC/, và sửa chữa lịch sử để nó trông giống như nó đã luôn luôn ở đó:

    $ cd /path/to/ABC 
    $ git filter-branch --index-filter \ 
        'git ls-files -s | sed "s-\t-&ABC/-" | 
        GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ 
        git update-index --index-info && 
        mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD 
    

    Bây giờ cấu trúc thư mục của bạn là ABC/ABC/your_code

  2. Tương tự với nội dung của DEF:

    $ cd /path/to/DEF 
    $ git filter-branch --index-filter \ 
        'git ls-files -s | sed "s-\t-&DEF/-" | 
        GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ 
        git update-index --index-info && 
        mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD 
    

    Bây giờ cấu trúc thư mục của bạn là DEF/DEF/your_code

  3. Cuối cùng, tạo kho PPP và kéo cả hai ABCDEF vào nó:

    $ mkdir /path/to/PPP 
    $ cd /path/to/PPP 
    $ git init 
    $ git pull /path/to/ABC 
    $ git pull /path/to/DEF 
    

    Bây giờ bạn có PPP/ABC/your_codePPP/DEF/your_code cùng với tất cả lịch sử.

Bạn có thể yêu cầu bạn đại học để chạy các lệnh trước trên hệ thống của họ, để mọi người được đồng bộ hóa.

Lưu ý: sự sôi nổi filter-branch lệnh come from the man page. :-)

+2

Lưu ý rằng điều này sẽ chỉ cập nhật chi nhánh đã thanh toán hiện tại trong mỗi tiểu dự án và sẽ chỉ kéo các nhánh đó vào repo mới. –

+12

BTW, một cách thay thế để sửa đổi repo hiện tại để di chuyển mọi thứ vào một thư mục con giống như 'git filter-branch --tag-name-filter cat -index-filter 'SHA = $ (git write-tree); rm $ GIT_INDEX_FILE && git đọc-cây --prefix = ABC/$ SHA '- --all'. Điều này cũng sẽ viết lại tất cả các chi nhánh và thẻ, không chỉ HEAD. –

+1

Lệnh bộ lọc chi nhánh sôi nổi là từ trang người dùng chi nhánh lọc của git. Bạn nên nói rằng như: a) nó phải được quy cho đúng b) Tôi sẽ không chạy một lệnh như vậy chỉ vì một ai đó, ngay cả với uy tín cao, đăng nó trên StackOverflow. Biết nó từ những trang người đàn ông tôi sẽ. – mayu

0

Đối với tôi, có vẻ như khó thực hiện theo cách bạn muốn vì lịch sử của cả hai dự án sẽ không hợp nhất.

Lời khuyên tốt nhất của tôi là tạo kho lưu trữ mới chứa ABC và DEF, giữ lại repo cũ từ hai bộ này để sao lưu lịch sử và bắt đầu lịch sử mới với dự án mới này.

5

Bạn có thực sự cần hợp nhất hai kho lưu trữ hiện tại vào một kho lưu trữ hay bạn chỉ muốn nhóm chúng?

Nếu bạn chỉ muốn nhóm chúng, sau đó git-submodule sẽ làm những gì bạn muốn: bạn sẽ kết thúc với ba kho lưu trữ nơi liên kết cấp cao nhất với hai vị trí hiện tại.

Là một hướng dẫn:

  • Bạn nên kết hợp chúng thành một kho lưu trữ duy nhất nếu bạn đang đi để tăng các khớp nối giữa chúng để nó không còn có ý nghĩa để sử dụng một phiên bản của repo A với Phiên bản khác nhau của repo B.

  • Bạn nên sử dụng mô-đun phụ nếu chúng vẫn còn tách biệt (đôi khi sẽ có ý nghĩa khi làm việc riêng lẻ), nhưng bạn muốn thuận tiện để có thể làm việc cùng nhau (ví dụ: tải xuống cả hai cùng một lúc, các trạng thái được biết là tốt trên cả hai, vv).

Sử dụng các mô-đun con sẽ tránh các vấn đề với các bản sao lưu trữ hiện tại, vì lịch sử không thay đổi. Hợp nhất chúng sẽ tạo ra một lịch sử mới và sẽ khó khăn hơn cho những người làm việc từ các chi nhánh hiện có để hợp nhất các thay đổi của họ.

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