2010-02-12 33 views
5

Tôi có một repo chính (repo 1) mà tôi làm việc với. Tôi có một repo (repo 2) mà cần phải phù hợp với một trong những đầu tiên và tôi không chắc chắn làm thế nào tôi có thể có cả hai trong cùng một thư mục. Ý tưởng là tôi có một codebase tiêu chuẩn mà tôi cần trong mỗi dự án - nhưng mỗi dự án lại là một repo git riêng của nó.Làm thế nào để bạn kết hợp hai repo git?

/project 
    /.git(repo 2) 
    /.git(repo 1) 
    /repo_2_sub 
     /repo_2_sub_sub 
      /repo_1_sub_sub 
    /repo_1_sub 
     /repo_1_sub_sub 
     /repo_2_sub_sub 

Không có tệp nào trùng lặp - nhưng một số cấu trúc thư mục làm. Vì vậy, đôi khi các thư mục nhất định từ một repo sẽ nằm trong repo khác.

Làm cách nào tôi có thể làm việc để hai kho này xây dựng bộ mã hoàn chỉnh?

CẬP NHẬT

Cả hai Repos git tồn tại ở mức thư mục dự án cùng một gốc. Chúng không thể là mô-đun con vì chúng đi qua lại qua nhau như được trình bày ở trên. Chúng không phải là các thư mục riêng biệt.

UPDATE 2

Chờ, có lẽ đây là dễ dàng hơn tôi nghĩ. Bạn có thể sao chép một repo codebase chuẩn và sau đó tạo một nhánh mới là dự án của bạn và sau đó chỉ cần tiếp tục hợp nhất nhánh đó với repo mã hóa mỗi khi nó thay đổi?

+1

Đọc qua các bản cập nhật và câu trả lời ở đây, có vẻ như câu trả lời đúng là tách hai dự án riêng biệt thành cấu trúc phụ thuộc an toàn hơn. – Novelocrat

+0

Vâng, tôi nghĩ vậy. – Xeoncross

Trả lời

1

Chờ, có lẽ đây là dễ dàng hơn tôi suy nghĩ. Bạn có thể sao chép một repo mã hóa tiêu chuẩn và sau đó tạo chi nhánh mới là dự án của bạn và sau đó chỉ tiếp tục hợp nhất chi nhánh đó với repo mã hóa mỗi lần thay đổi?

Bạn có thể làm điều đó. Tôi cũng có một dự án mà tôi đang làm như thế này. Hầu hết các mã là như nhau cho tất cả các tiểu dự án. Tôi tạo một nhánh mới cho mỗi dự án để giữ các tệp chỉ thuộc về dự án đó được tách ra. Tôi thường xuyên hợp nhất chi nhánh master vào các nhánh khác.

Bạn cũng có thể tạo bản sao của kho lưu trữ chính. Sau đó, bạn sẽ chỉ hợp nhất các thay đổi từ chi nhánh origin/master vào chi nhánh master trong mỗi dự án của bạn.

+0

Nghe có vẻ như đây là cách dễ nhất để xử lý một cái gì đó như thế này vì bạn không cần phải giải thích một thiết lập phức tạp cho từng thành viên trong nhóm và cho từng dự án. Thêm vào đó có vẻ như ít bị lỗi. – Xeoncross

2

Sử dụng git submodule

Cập nhật:

Các cơ sở mã tiêu chuẩn mà cần phải là một phần của tất cả các hợp đồng mua lại phải là một kho git biệt riêng biệt.

git submodule add <repo_nick_name> <repo_path> 

sẽ thêm repo đó vào danh sách này. Về nhân bản và đẩy, chỉ có các tập tin .gitmodules và băm tại repo sẽ được đẩy/nhân bản.

git submodule init 

git submodule update 

lần lượt khởi và cập nhật Repos submodule từ xa.

Để biết thông tin chi tiết, hãy kiểm tra màn hình chính của git community book documentation on git submodules và/hoặc scot chacon.

+0

Vấn đề là chúng là các dự án trong cùng một thư mục cơ sở. – Xeoncross

+0

Đó không phải là vấn đề. submodules tồn tại trong cùng thư mục với module. –

2

Chỉnh sửa: Để có hai thư mục .git, khi bạn khởi tạo chúng, sẽ có thêm một số công việc. Khi bạn bắt đầu, hãy làm:

git --git-dir=.git1 --work-tree=. init 
git --git-dir=.git2 --work-tree=. init 

Bây giờ bạn có hai thư mục git trong cùng một thư mục. Không đẹp lắm. Tại thời điểm này, hãy chắc chắn rằng bạn có .git1 và .git2 trong cả hai .gitignores, vì chúng không bị bỏ qua theo mặc định. Ngoài ra, mọi lệnh git bạn chạy cũng phải có đối số --git-dir để chỉ định kho lưu trữ nào bạn đang tương tác. Bạn có thể thiết lập bí danh cho điều đó.

Vì chúng nằm trong cùng thư mục cơ sở và mô-đun con sẽ không hoạt động, bạn có thể đặt các tệp '.gitignore' bên trong cả hai thư mục '.git/info/exclude'. Đặt chúng vào .git/info/exclude đảm bảo rằng các repo khác không nhận các loại trừ.

Có thể mất một số bảo trì nếu hai repos khác nhau bởi độ chi tiết mịn hơn so với thư mục, nhưng nếu bạn chỉ định trong mỗi thư mục.gitignore các tệp chỉ thuộc về repo KHÁC, nó sẽ hoạt động.

Xem: gitignore

+0

Bạn thực sự không thể có hai thư mục '.git' - tôi chỉ đặt chúng ở đó để hiển thị những gì tôi nghĩ * muốn *. – Xeoncross

+0

Vâng, bạn có thể, nó chỉ mất một số công việc phụ. Xem chỉnh sửa của tôi. – bobDevil

+0

Crazy man. Tôi không nghĩ rằng tôi sẽ đi tuyến đường này vì nó có vẻ như một hack. Thêm vào đó, nó sẽ là một nỗi đau để thiết lập một loạt các cài đặt nhóm như thế này. Tuyệt vời để biết nó hoạt động mặc dù! – Xeoncross

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