Câu hỏi Cách dễ dàng để kéo mới nhất của tất cả các submodules git


Chúng tôi đang sử dụng các mô đun con git để quản lý một vài dự án lớn có phụ thuộc vào nhiều thư viện khác mà chúng tôi đã phát triển. Mỗi thư viện là một repo riêng biệt được đưa vào dự án phụ thuộc như một submodule. Trong quá trình phát triển, chúng tôi thường chỉ muốn lấy phiên bản mới nhất của từng mô-đun con phụ thuộc.

Liệu git có một lệnh được xây dựng để làm điều này? Nếu không, làm thế nào về một tập tin batch Windows hoặc tương tự mà có thể làm điều đó?


1379
2018-06-23 01:05


gốc


git-deep nên giúp đỡ với điều này. - bluejamesbond
@Brad bạn có muốn cập nhật các bản sao của các mô-đun con của bạn thành các vòng quay cam kết có tên trong dự án chính không; hoặc bạn có muốn kéo cam kết HEAD mới nhất từ ​​mọi mô-đun con không? Hầu hết các câu trả lời ở đây là địa chỉ cũ; nhiều người muốn thứ hai. - chrisinmtown


Các câu trả lời:


Dành cho git 1.8.2 hoặc cao hơn tùy chọn --remote đã được thêm vào để hỗ trợ cập nhật các mẹo mới nhất của các nhánh từ xa:

git submodule update --recursive --remote

Điều này có thêm lợi ích của việc tôn trọng bất kỳ chi nhánh "không mặc định" nào được chỉ định trong .gitmodules hoặc là .git/config tệp (nếu bạn có bất kỳ tệp nào, mặc định là origin / master, trong trường hợp này một số câu trả lời khác ở đây cũng sẽ hoạt động).

Dành cho git 1.7.3 hoặc ở trên, bạn có thể sử dụng (nhưng các dấu hiệu dưới đây xung quanh những gì cập nhật vẫn áp dụng):

git submodule update --recursive

hoặc là:

git pull --recurse-submodules

nếu bạn muốn kéo các mô-đun con của bạn đến các cam kết mới nhất, hãy xem xét những gì repo trỏ tới.

Lưu ý: Nếu đó là lần đầu tiên bạn thanh toán một repo bạn cần sử dụng --init Đầu tiên:

git submodule update --init --recursive

Dành cho cũ hơn, git 1.6.1 hoặc cao hơn bạn có thể sử dụng một cái gì đó tương tự như (sửa đổi cho phù hợp):

git submodule foreach git pull origin master

Xem git-submodule (1) để biết chi tiết


1756
2018-06-23 13:42



Có lẽ bạn nên sử dụng git submodule update --recursive ngày nay. - Jens Kohl
Cải thiện hiệu suất: git submodule foreach "(git checkout master; git pull)&" - Bogdan Gusiev
cập nhật sẽ cập nhật từng mô-đun con đến bản sửa đổi được chỉ định, không cập nhật nó lên phiên bản mới nhất cho kho lưu trữ đó. - Peter DeWeese
Chỉ cần thêm, gắn bó một cách mù quáng origin master ở cuối lệnh này có thể có kết quả không mong muốn nếu một số mô-đun con của bạn đang theo dõi tên chi nhánh hoặc tên vị trí khác của mô-đun con cụ thể đó. Rõ ràng với một số, nhưng có lẽ không phải tất cả mọi người. - Nathan Hornby
Chỉ cần làm rõ cho mọi người. git submodule update --recursive trông để xem bản sửa đổi nào kho lưu trữ gốc đã lưu trữ cho từng mô-đun con, sau đó kiểm tra bản sửa đổi đó trong từng mô-đun con. Nó không KHÔNG PHẢI kéo các cam kết mới nhất cho từng mô-đun con. git submodule foreach git pull origin master hoặc là git pull origin master --recurse-submodules là những gì bạn muốn nếu bạn dự định cập nhật từng mô-đun con mới nhất từ ​​kho gốc của chúng. Chỉ sau đó bạn sẽ nhận được các thay đổi đang chờ xử lý trong repo gốc với băm sửa đổi cập nhật cho các mô-đun con. Kiểm tra những người ở và bạn tốt. - Chev


Nếu bạn cần phải kéo công cụ cho submodules vào kho lưu trữ submodule của bạn sử dụng

git pull --recurse-submodules

một tính năng git đầu tiên được học trong 1.7.3.

Nhưng điều này sẽ không kiểm tra các cam kết thích hợp (những cái mà kho lưu trữ chính của bạn trỏ tới) trong các mô-đun con

Để kiểm tra các cam kết thích hợp trong các mô-đun con của bạn, bạn nên cập nhật chúng sau khi kéo sử dụng

git submodule update --recursive --remote

567
2017-11-10 18:07



upvoted, tôi sử dụng điều này: alias update_submodules = 'git pull --recurse-submodules && git submodule update' - Stephen C
Điều này hoạt động nếu các mô-đun con đã được kéo ít nhất một lần nhưng đối với các mô-đun con chưa bao giờ được kiểm tra, hãy xem câu trả lời của gahooa dưới đây. - Matt Browne
Điều này sẽ kéo lên phiên bản repo hàng đầu chỉ định; nó KHÔNG kéo HEAD. Ví dụ, nếu TopRepo chỉ định một phiên bản 2 sau HEAD cho SubRepo, điều này sẽ kéo SubRepo với phiên bản đó là 2 phía sau. Câu trả lời khác ở đây kéo HEAD trong SubRepo. - Chris Moschini
Lưu ý rằng cả hai git pull --recurse-submodules cũng không git submodule update --recursive làm không phải khởi tạo các mô-đun con mới được thêm vào. Để khởi tạo chúng, bạn cần chạy git submodule update --recursive --init. Trích dẫn từ thủ công: Nếu submodule chưa được khởi tạo, và bạn chỉ muốn sử dụng thiết lập như được lưu trữ trong .gitmodules, bạn có thể tự động khởi tạo submodule với tùy chọn --init. - patryk.beza
có thể thêm gợi ý vào git submodule update --recursive --remote cũng cập nhật các mô-đun con thành phiên bản mới nhất từ ​​xa thay vì SHA-1 được lưu trữ. - Hanno S.


Lưu ý: Đây là từ năm 2009 và có thể đã được tốt sau đó, nhưng có những lựa chọn tốt hơn bây giờ.

Chúng tôi sử dụng điều này. Nó được gọi là git-pup:

#!/bin/bash
# Exists to fully update the git repo that you are sitting in...

git pull && git submodule init && git submodule update && git submodule status

Chỉ cần đặt nó vào một thư mục bin phù hợp (/ usr / local / bin). Nếu trên Windows, bạn có thể cần phải sửa đổi cú pháp để làm cho nó hoạt động :)

Cập nhật:

Đáp lại lời bình luận của tác giả gốc về việc kéo tất cả các HEAD của tất cả các mô-đun con - đó là một câu hỏi hay.

Tôi khá chắc chắn rằng git không có lệnh cho nội bộ này. Để làm như vậy, bạn sẽ cần phải xác định những gì HEAD thực sự là cho một submodule. Điều đó có thể đơn giản như nói master là chi nhánh cập nhật nhất, v.v ...

Sau này, tạo ra một kịch bản đơn giản mà làm như sau:

  1. kiểm tra git submodule status cho kho "đã sửa đổi". Ký tự đầu tiên của các dòng đầu ra cho biết điều này. Nếu một repo phụ được sửa đổi, bạn có thể KHÔNG muốn tiếp tục.
  2. cho mỗi repo được liệt kê, cd vào thư mục của nó và chạy git checkout master && git pull. Kiểm tra lỗi.
  3. Cuối cùng, tôi đề nghị bạn in một màn hình hiển thị cho người dùng để cho biết trạng thái hiện tại của các mô-đun con - có lẽ nhắc họ thêm tất cả và cam kết?

Tôi muốn đề cập đến rằng phong cách này không thực sự là những gì submodules git được thiết kế cho. Thông thường, bạn muốn nói "LibraryX" ở phiên bản "2.32" và sẽ vẫn như vậy cho đến khi tôi yêu cầu "nâng cấp".

Đó là, theo nghĩa nào đó, những gì bạn đang làm với kịch bản được mô tả, nhưng chỉ tự động hơn. Cần có sự chăm sóc!

Cập nhật 2:

Nếu bạn đang ở trên nền tảng cửa sổ, bạn có thể muốn xem xét sử dụng Python để triển khai kịch bản vì nó rất có khả năng trong các khu vực này. Nếu bạn đang trên unix / linux, sau đó tôi đề nghị chỉ là một kịch bản bash.

Cần làm rõ? Chỉ cần đăng bình luận.


295
2018-06-23 01:50



Tôi không nghĩ đó là điều tôi muốn. Sẽ không kéo phiên bản của các mô-đun con mà siêu dự án đã được cam kết cuối cùng. Tôi muốn kéo phiên bản đầu của tất cả các submodules. - Brad Robinson
Điều này làm việc tuyệt vời, và hoạt động không chỉ để cập nhật submodules mà còn để lấy chúng lần đầu tiên nếu đó là những gì bạn cần. - Matt Browne
Tôi chỉ nhận được "Không có thông tin theo dõi cho chi nhánh hiện tại. Vui lòng chỉ định nhánh nào bạn muốn hợp nhất." Không có vấn đề gì tôi cố gắng: / - Nathan Hornby
Tại sao không tạo bí danh cho nó? git config --global alias.pup '!git pull && git submodule init && git submodule update && git submodule status' và sau đó sử dụng nó như git pup mà không cần bất kỳ kịch bản nào. - fracz
Cảm ơn bạn, vì lý do nào đó mặc dù tôi có git 1.9.1 tôi đã phải thực hiện git submodule init sau lần kéo đầu tiên có các mô-đun con được bao gồm, sao cho mọi thứ sẽ bắt đầu hoạt động bình thường. - Ben Usman


Trên init chạy lệnh sau:

git submodule update --init --recursive

từ bên trong thư mục repo git, hoạt động tốt nhất cho tôi.

Điều này sẽ kéo tất cả mới nhất bao gồm cả mô-đun con.

Giải thích

git - the base command to perform any git command
    submodule - Inspects, updates and manages submodules.
        update - Update the registered submodules to match what the superproject
        expects by cloning missing submodules and updating the working tree of the
        submodules. The "updating" can be done in several ways depending on command
        line options and the value of submodule.<name>.update configuration variable.
            --init without the explicit init step if you do not intend to customize
            any submodule locations.
            --recursive is specified, this command will recurse into the registered
            submodules, and update any nested submodules within.

Sau này, bạn chỉ có thể chạy:

git submodule update --recursive

từ bên trong thư mục repo git, hoạt động tốt nhất cho tôi.

Điều này sẽ kéo tất cả mới nhất bao gồm cả mô-đun con.

Giải thích

git - the base command to perform any git command
    submodule - Inspects, updates and manages submodules.
        update - Update the registered submodules to match what the superproject
        expects by cloning missing submodules and updating the working tree of the
        submodules. The "updating" can be done in several ways depending on command
        line options and the value of submodule.<name>.update configuration variable.
            any submodule locations.
            --recursive is specified, this command will recurse into the registered
            submodules, and update any nested submodules within.

290
2017-12-11 19:38



Có - câu trả lời bình chọn cao nhất là cách tốt nhất để làm điều đó trong '09, nhưng điều này chắc chắn đơn giản và trực quan hơn bây giờ. - Michael Scott Cuthbert
@MichaelScottCuthbert cảm ơn, tôi chắc chắn trong 3 năm nữa, lệnh này cũng sẽ rất điên rồ - abc123
Tuy nhiên, điều này không kiểm tra phiên bản mới nhất từ ​​mô-đun con, chỉ bản sửa đổi mới nhất mà phụ huynh đang theo dõi. - Nathan Osman
@NathanOsman đó là những gì bạn muốn ... bạn sẽ kết thúc với mã bị hỏng bằng cách không theo dõi theo dõi sửa đổi của cha mẹ. Nếu bạn là người bảo trì của phụ huynh, bạn có thể tự cập nhật và cam kết chúng. - abc123
Có, nhưng từ sự hiểu biết của tôi, đó không phải là những gì OP muốn. - Nathan Osman


Henrik đang đi đúng hướng. Lệnh 'foreach' có thể thực thi bất kỳ kịch bản lệnh tùy ý nào. Hai tùy chọn để kéo mới nhất có thể là,

git submodule foreach git pull origin master

và,

git submodule foreach /path/to/some/cool/script.sh

Điều đó sẽ lặp qua tất cả khởi tạo submodules và chạy các lệnh đã cho.


151
2018-06-23 14:21





Sau đây đã làm việc cho tôi trên Windows.

git submodule init
git submodule update

138
2017-07-22 13:12



Điều này rõ ràng không phải là những gì OP yêu cầu. Nó sẽ chỉ cập nhật cho các mô-đun submodule liên quan và không phải là mới nhất. - Patrick
Tuy nhiên, đây là điều duy nhất trên trang này có git để kéo submodules trong lần đầu tiên tôi kiểm tra một repo - theheadofabroom
Cũng có thể sử dụng: git submodule update --init --recursive (đặc biệt nếu submodule trong câu hỏi là RestKit từ bản sao mới) - HCdev


Chỉnh sửa:

Trong các ý kiến ​​đã được chỉ ra (bởi philfreo ) cần có phiên bản mới nhất. Nếu có bất kỳ mô-đun con lồng nhau nào cần phải có trong phiên bản mới nhất của chúng:

git submodule foreach --recursive git pull

----- Lỗi thời bình luận dưới đây -----

Đây không phải là cách chính thức để làm điều đó sao?

git submodule update --init

Tôi sử dụng nó mọi lúc. Không có vấn đề cho đến nay.

Chỉnh sửa:

Tôi chỉ thấy rằng bạn có thể sử dụng:

git submodule foreach --recursive git submodule update --init 

Mà cũng sẽ đệ quy kéo tất cả các mô-đun con, tức là phụ thuộc.


33
2018-04-05 16:23



Câu trả lời của bạn không trả lời câu hỏi của OP, nhưng để làm những gì bạn đã đề xuất, bạn chỉ có thể nói git submodule update --init --recursive - philfreo
Tôi thấy, phiên bản mới nhất là cần thiết. Điều này có thể hữu ích nếu có các mô-đun con lồng nhau:git submodule foreach --recursive git pull - antitoxic
Tôi không thể thực hiện bất kỳ một trong những thực sự tải về bất cứ điều gì - "git submodule update --init --recursive" làm việc cho tôi tuy nhiên. - BrainSlugs83