2011-08-24 30 views
39

Giả sử chúng ta có cấu trúc kho sau trên github:một công việc tốt cho dĩa submodule là gì

company:project.git 
    \- company:submodule.git 

Một nhà phát triển trong dĩa công ty của tôi dự án công ty, làm cho không gian làm việc của mình trông như thế này:

developer:project.git 
    \- company:submodule.git 

Điều này là tốt cho 90% nhà phát triển vì chúng không thay đổi thư viện con, chúng chỉ hoạt động trong dự án. Bây giờ giả sử có một tính năng mới yêu cầu cải tiến trong mô-đun con. Các nhà phát triển buộc tội này chuyển đổi không gian làm việc của mình như thế này:

developer:project.git 
    \- developer:submodule.git 

Bắt đó không phải là tầm thường như anh ta cần phải thay thế một submdule với submodule khác (để git, bản gốc và ngã ba của submodule là hai việc khác nhau) .

Nếu nhà phát triển này hoạt động trên thư viện lâu hơn một chút, anh ấy cam kết cấu trúc này với nhánh chính của anh ấy, vì vậy nĩa của anh ấy trên github luôn sử dụng bảng con được chia nhỏ.

Khi anh ấy sẵn sàng phát triển, anh ấy sẽ tạo yêu cầu kéo. Vấn đề là khi sáp nhập theo yêu cầu kéo kho chính sẽ trông như thế này:

company:project.git 
    \- developer:submodule.git 

Đây là vấn đề như bây giờ mỗi nhà phát triển theo dõi các chi nhánh công ty sẽ kết thúc với submodule của nhà phát triển.

Để khắc phục sự cố, trước khi nhà phát triển đưa ra yêu cầu kéo, nhánh chính của anh ấy phải được chuyển về công ty: submodule.git - điều này rất khó xử, đặc biệt là vì anh ấy luôn muốn làm việc nhà phát triển: submodule.git.

Chúng tôi đã thử một số quy trình công việc và vấn đề ở trên là vấn đề duy nhất mà chúng tôi chưa có quy trình làm việc tốt.

+0

Luồng công việc lạ này. Tại sao bạn sẽ có dĩa trong các mô-đun và không phải trong các chi nhánh? –

+0

cành và nhánh là 2 thứ riêng biệt. Chúng tôi sử dụng dĩa - người duy trì dự án kéo các yêu cầu kéo từ các nhánh của nhà phát triển. Yêu cầu kéo được xem xét mã. Với dĩa, chúng tôi chỉ phải cung cấp quyền truy cập chỉ đọc vào các kho lưu trữ chính, đây là cách tuyệt vời để giữ nguyên kho lưu trữ chính. Các mô-đun con được thiết kế cho mã reuese, chúng bao gồm các thư viện (của chúng tôi và của bên thứ ba libs) được tái sử dụng giữa các dự án. –

+0

Vâng có ý nghĩa. Tôi sẽ đặt mỗi dự án vào một repo git riêng biệt (không phải là một module), nhưng tôi đoán, đó chỉ là sở thích cá nhân. –

Trả lời

5

Khi nhà phát triển tạo ra một cam kết với mô-đun con tại một phiên bản cụ thể, đó là một tuyên bố mạnh mẽ rằng siêu mô hình làm việc với mô-đun con tại phiên bản chính xác đó.Nếu mã của ông không thực sự làm việc với phiên bản của công ty của submodule, tôi nghĩ rằng điều phải làm là dành cho các nhà phát triển để:

  1. chi nhánh supermodule
  2. kiểm tra phiên bản công ty trong submodule
  3. cập nhật .gitmodules trong supermodule, nếu nhà phát triển thay đổi mà từ phiên bản thượng nguồn
  4. sân khấu và cam kết rằng sự thay đổi
  5. kiểm tra tất cả mọi thứ
  6. vấn đề theo yêu cầu kéo

Sau đó, anh ấy có thể chuyển về nhánh phát triển bình thường của mình trong siêu mô hình.

Một điều tôi không hiểu về câu hỏi của bạn như sau:

Bắt đó không phải là tầm thường như anh ta cần phải thay thế một submdule với submodule khác (để git, bản gốc và ngã ba của submodule là hai thứ khác nhau).

Ngược lại, mô-đun con có thể là bất kỳ kho lưu trữ git nào miễn là nó chứa cam kết mà siêu mẫu trỏ đến. Nếu có hai kho lưu trữ từ xa khác nhau, anh ta chỉ có thể thêm một điều khiển từ xa phụ trong mô-đun con. (Các nhà phát triển nên thay đổi .gitmodules cũng như nếu họ sẽ chia sẻ kho lưu trữ của mình với bất cứ ai khác.)


Đáp lại bình luận của bạn dưới đây, có lẽ nó có giá trị đi qua làm thế nào để chuyển đổi một submodule từ trỏ đến một phiên bản khác. Giả sử nhà phát triển đang sử dụng kho lưu trữ của riêng họ cho siêu và mô-đun con, nhưng cả hai đều được sao chép từ phiên bản của công ty (nghĩa là hầu hết lịch sử giống nhau) và mô-đun con ở đường dẫn lib. Bây giờ, nhà phát triển muốn chuyển mô-đun con để trỏ đến phiên bản của công ty. Họ có thể thực hiện những việc sau:

  1. Chỉnh sửa thông số url cho môđun con tại .gitmodules để trỏ đến kho lưu trữ của công ty.
  2. cd lib
  3. git remote add company [email protected]:/srv/git/lib.git
  4. git fetch company
  5. git checkout -b upstream-master company/master
  6. cd ..
  7. git add .gitmodules lib
  8. git commit -m "Switch the lib submodule to point back to the company's version"

bước 3-5 chỉ có thể chan ged đến git checkout <whatever> khi điều khiển từ xa và nhánh được thiết lập.

+1

Nếu bạn chỉ cần thay đổi .gitmodules git sẽ bị nhầm lẫn. Chuyển đổi giữa các nhánh đòi hỏi phải loại bỏ nguồn, thay đổi .gitmodules để loại bỏ các ngã ba cũ, cam kết, thêm các ngã ba khác như là một submodule, cam kết một lần nữa - đó là những gì tôi có nghĩa là với không tầm thường. –

+1

Không, '.gitmodules' chỉ có hiệu lực khi bạn khởi tạo mô-đun con đầu tiên. Một khi nó được khởi tạo và cập nhật, bạn có thể làm bất cứ điều gì bạn thích cho submodule như thể nó là một kho lưu trữ độc lập mà không cần chạm vào '.gitmodules'. –

+0

Tất nhiên, nếu nhà phát triển cho phép người khác sao chép phiên bản của mình, '.gitmodules' phải chứa một con trỏ đến kho lưu trữ chứa cam kết trong mô-đun con. Tuy nhiên, bạn chắc chắn không cần phải loại bỏ submodule và thay thế nó để làm điều đó. –

2

Đối với anh ta để phát triển trên nó, dev không cần phải thay đổi submodule chính nó - họ có thể thêm một điều khiển từ xa và đẩy nó.

Ví dụ:

developer:project.git 
    \- company:submodule.git 
     Origins: company/submodule.git 
       developer/submodule.git 

Workflow:

cd path/to/submodule 
git remote add developer [email protected]/developer/submodule.git 

// hack vào các dự án

cd path/to/submodule 
git push developer branchname 

Đó chắc chắn là không hoàn hảo và có thể gây ra vấn đề nếu một yêu cầu kéo về nhà phát triển/dự án làm cho nó vào công ty/dự án trước khi nhà phát triển/submodule làm cho nó vào công ty/submodule.

Chỉ cần suy nghĩ nhanh của tôi.

3

Một giải pháp đơn giản khác là bảo git bỏ qua .gitmodules và xóa chúng khỏi theo dõi. Như đã nói ở trên, .gitmodules chỉ được sử dụng để khởi tạo mô-đun con, vì vậy nó chỉ cần một lần, khi kiểm tra các mô-đun con.

+1

Đó là thú vị ".gitmodules được sử dụng chỉ để khởi tạo submodules". Tôi đoán bạn nói đúng, nhưng tôi sẽ là 9/10 người không nhận ra/đăng ký sự thật đó. Nó chắc chắn có liên quan đến trường hợp sử dụng này. –

0

Bây giờ giả sử có một tính năng mới yêu cầu cải tiến trong mô-đun con.

Đóng góp được thực hiện trong mô hình con, chỉ cam kết trong mô-đun git repo con sẽ được yêu cầu kéo, như thường lệ.

Để đẩy trên submodule ngã ba của bạn,

  • dự án .gitmodules cấu hình có thể được thay đổi trong ngã ba nhân bản của bạn (nhưng được giữ về phía bạn)
  • hoặc submodule ngã ba của bạn có thể được thêm vào như là một từ xa
Các vấn đề liên quan