2015-07-03 20 views
5

Tôi có khoảng 20 kho lưu trữ khác nhau. Nhiều người độc lập và biên dịch như các thư viện nhưng một số khác lại có sự phụ thuộc trong số đó. Độ phân giải phụ thuộc và phân nhánh phức tạp.Thực hành tốt nhất cho nhiều kho lưu trữ git

Giả sử rằng tôi có siêu dự án chỉ tổng hợp tất cả các kho lưu trữ khác. Nó được sử dụng độc quyền để chạy thử nghiệm - không có phát triển thực sự nào ở đây.

/superproject [master, HEAD] 
    /a   [master, HEAD] 
    /b   [master, HEAD] 
    /c   [master, HEAD] 
    /... 

Bây giờ, để phát triển các tính năng hoặc sửa chữa cụ thể cho mỗi người (a), đặc biệt là một trong những đòi hỏi phiên bản cụ thể của dự án để biên dịch hoặc chạy (b v2.0c 3.0) Tôi có để tạo ra một chi nhánh mới:

/superproject [branch-a, HEAD] <-- branch for 'a' project 
    /a   [master] <-- new commits here 
    /b   [v2.0] 
    /c   [v3.0] 

Đối b, nó có thể được yêu cầu cái gì khác, như a v0.9c v3.1:

/superproject [branch-b, HEAD] <-- branch for 'b' project 
    /a   [v0.9] <-- older version than 'a' 
    /b   [master] <-- new commits go here 
    /c   [v3.1] <-- newer version than 'a' 

này càng trở nên phức tạp và phức tạp khi thực hiện công việc git chung liên quan đến các ngành chức năng, ngành hotfix, chi nhánh phát hành, vv Tôi được khuyên là nên (và khuyên chống lại) sử dụng git-submodules, git-subtree, của google git-repo, git-slave vv

Làm cách nào để quản lý tích hợp liên tục cho một dự án phức tạp như vậy?

EDIT

Câu hỏi thực sự là làm thế nào để chạy thử nghiệm mà không cần phải thử tất cả các dự án phụ thuộc khác? Đặc biệt là khi tất cả các dự án có thể sử dụng các phiên bản khác nhau. Trigger Jenkins tests after commits in git submodules

+1

Tôi thực sự sẽ không khuyến khích một kiến ​​trúc như vậy. Việc có một kho lưu trữ như thế sẽ chỉ gây nhầm lẫn cho các nhà bảo trì và việc thử nghiệm thực sự nên được thực hiện cho mỗi dự án. – Makoto

+0

Các thư mục riêng lẻ ở trên là các kho .git khác nhau, chứ không phải là một tệp lớn duy nhất - nếu không chúng không thể có các nhánh và thẻ khác nhau. – AlBlue

+0

Câu hỏi thực sự là làm thế nào để chạy thử nghiệm mà không cần phải giả lập tất cả các dự án phụ thuộc khác? Đặc biệt là khi tất cả các dự án có thể sử dụng các phiên bản khác nhau. – betodelrio

Trả lời

3

Để làm việc với nhiều nhánh song song, hãy sử dụng các dòng vô tính song song nếu có thể. cd dễ dàng hơn rất nhiều so với thanh toán và dọn dẹp và kiểm tra-cho-cũ-detritus và tái tạo-cache mỗi khi bạn muốn chuyển đổi.


Cho đến khi ghi lại môi trường thử nghiệm, bạn mô tả chính xác những gì mô-đun con làm, trong mọi chi tiết. Đối với một cái gì đó đơn giản này, tôi sẽ khuyên bạn nên thiết lập chính mình mà không cần sử dụng lệnh submodule ở tất cả, và nói cho nó về thiết lập của bạn một khi bạn cảm thấy thoải mái và đầu mục trên danh sách submodule-vấn đề của bạn là gõ phím.

Bắt đầu từ việc thiết lập trong câu hỏi của bạn, dưới đây là cách bạn đặt mình lên để ghi lại sạch được xây dựng trong các tiểu dự án:

cd $superproject 
git init . 
git add a b c etc 
git commit -m "recording test state for $thistest" 

Vậy là xong. Bạn đã cam kết danh sách các ID cam kết, tức là id của các cam kết hiện đã được kiểm tra trong mỗi repos đó. Nội dung thực tế nằm trong các bản repo đó, không phải cái này, nhưng đó là toàn bộ sự khác biệt giữa các tệp và các mô-đun con cho đến khi có liên quan đến git. Tệp .gitmodules có các ghi chú ngẫu nhiên để giúp các nhà cloners, chủ yếu là một repo được đề xuất có chứa các cam kết cần thiết và ghi chú ngẫu nhiên cho các lệnh mặc định, nhưng những gì nó làm là dễ dàng và rõ ràng.

Muốn kiểm tra cam kết đúng tại đường dẫn foo?

(commit=`git rev-parse :foo`; cd foo; git checkout $commit) 

Các rev-phân tích cú pháp fetches các id nội dung cho foo khỏi chỉ mục, cd và kiểm tra thực hiện điều đó.

Đây là cách bạn tìm thấy tất cả các môđun con của bạn và những gì nên được kiểm tra ra khỏi đó để tái tạo lại dàn dựng môi trường aka lập chỉ mục:

git ls-files -s | grep ^16 

Kiểm tra những gì danh sách chỉ số hiện tại của bạn cho một submodule và những gì đang thực sự kiểm tra trên mạng:

echo $(git rev-parse :$submodule; (cd $submodule; git rev-parse HEAD)) 

và ở đó bạn đi. Kiểm tra các cam kết đúng trong tất cả các mô-đun con của bạn?

git ls-files -s | grep ^16 | while read mode commit stage path; do 
     (cd "$path"; git checkout $commit) 
done 

Đôi khi bạn đang mang theo các bản vá lỗi địa phương mà bạn muốn áp dụng cho tất cả các thanh toán:

git ls-files -s | grep ^16 | while read mode commit stage path; do 
     (cd $path; git rebase $commit) 
done 

và vân vân. Có git submodule lệnh cho những điều này, nhưng chúng không làm bất cứ điều gì bạn không thấy ở trên. Tương tự cho tất cả các phần còn lại, bạn có thể dịch tất cả mọi thứ họ làm vào gần như oneliners như những người ở trên.

Không có gì bí ẩn về mô-đun con.


tích hợp liên tục thường được thực hiện với any of a whole lot of tools, tôi sẽ để lại cho người khác để giải quyết.

+0

Câu trả lời hay. Làm cách nào để theo dõi các phụ thuộc phiên bản mà không định kỳ thành ** submodules ** siêu cấp cao?Dự án 'a' yêu cầu' b' trong một phiên bản cụ thể. Tôi có thể thiết lập sự ràng buộc đó như là một phần của 'a' không? – betodelrio

+0

Ah, được rồi, tôi đang đưa con tôi đến trại và có một chút hasty w/prev bình luận. Có, bạn có thể làm phụ thuộc của bạn theo cách đó - cho rằng, không có tiện ích submodule, nhưng một lần nữa nó là một oneliner gần - để thêm một submodule mà thực sự cư trú ở nơi khác, bạn đi đến nơi khác và nói 'git config worktree ..' để đinh xuống vị trí của worktree và trong worktrees sử dụng nó thay vì cập nhật submodule ban đầu của bạn, bạn làm 'echo gitdir: /path/to/projecta/.git> $ theprojectbpath_in_a'. Chơi xung quanh với điều đó, tôi sẽ có thêm thời gian có thể vào ngày mai. – jthill

2

Là tác giả, git slave có thể hoạt động trong tình huống này. Làm thế nào để sử dụng nó sẽ phụ thuộc vào việc bạn có quyền kiểm soát repos abc; do đó tôi có nghĩa là bạn có thể khiến chiến lược chi nhánh được đồng bộ giữa chúng để nhánh v2 có nghĩa là cùng một thứ cho mọi người. Nếu điều này là đúng, tôi sẽ mạnh mẽ yêu cầu git slave vì bạn về cơ bản có thể coi nó là một dự án lớn.

Nếu bạn không thể ủy thác một chiến lược chi nhánh và thẻ chung thì bạn sẽ áp đặt một chiến lược, đó là nhận được nhiều hơn đối với một phiên bản nhẹ của luồng công việc mà jthill đề xuất với git submodules. Cụ thể, bạn có thể có theo dõi repo của riêng mình abc và tạo chi nhánh branch a trong mỗi chi tiết, tương ứng với bất kỳ nhánh chính xác nào cho mỗi repo nô lệ. Giống như git submodules bạn sẽ phải tự mang mỗi repo cập nhật (hợp nhất trong trường hợp này). Tuy nhiên, bạn sẽ không cần phải thực hiện bước đi của mẹ và tôi có thể thực hiện cam kết trong siêu dự án. Sử dụng kỹ thuật này không phải là trường hợp sử dụng slam-dunk của việc có các dự án nô lệ chia sẻ cùng một tên chi nhánh khi chúng phát triển riêng của chúng, nhưng nó sẽ hoạt động.

Như jthill đã nói, việc tích hợp liên tục là khá nhiều trực quan đối với câu hỏi về cách sắp xếp lại các dự án.

+0

Không, tôi không thể ủy thác một nhánh/thẻ chung trong các mô-đun con (repos nô lệ). 'gits' dường như phức tạp hơn những gì tôi đang cố gắng đạt được nhưng sẽ thử. Cảm ơn bạn: D – betodelrio

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