Có cách nào để làm cho git pull tự động cập nhật các mô đun con không?


203

Có cách nào để tự động có git submodule update(hoặc tốt nhất git submodule update --initlà gọi bất cứ khi nào git pullđược thực hiện?

Tìm kiếm một cài đặt cấu hình git hoặc bí danh git để trợ giúp việc này.



1
Tại sao một bí danh git thích hợp hơn một bí danh vỏ?
wnoise

20
bí danh git là tốt vì nó gói gọn lệnh trong không gian tên "git". Bạn cũng có thể hỏi tại sao tất cả các lệnh git bắt đầu bằng "git" thay vì có tên riêng của họ.
Lily Ballard

5
Đối với bất cứ ai tìm thấy điều này, các câu trả lời được bình chọn cao hiện đã lỗi thời. Câu trả lời của Kane là chính xác: stackoverflow.com/a/49427199 43299424
John Neuhaus

Câu trả lời:


176

Kể từ Git 2.14 , bạn có thể sử dụng git pull --recurse-submodules(và bí danh nó cho bất cứ điều gì bạn thích).

Kể từ Git 2.15 , bạn có thể đặt submodule.recursethành true để bật hành vi mong muốn.

Bạn có thể làm điều này trên toàn cầu bằng cách chạy:

git config --global submodule.recurse true

3
Xác nhận với 2.16, đặt điều này thành true sẽ khiến git pullcho việc tìm nạp một mô hình con và chạy submodule update. Đây thực sự cần phải là câu trả lời được chấp nhận ngay bây giờ
John Neuhaus

1
Để thiết lập điều này trên toàn cầu:git config --global submodule.recurse true
mùa đông

14
Tôi đã thất vọng bởi các mô hình con, sau đó tôi đã làm điều này. Bây giờ họ làm việc như tôi mong đợi. Có một lý do tôi không nghĩ rằng đây không phải là hành vi mặc định?
Ben

9
Họ nên cho phép điều đó git clonelà tốt. Và làm cho nó theo mặc định. Mặt khác, sẽ luôn có sự kháng cự rất lớn đối với việc sử dụng các mô hình con, vì các mô-đun của mọi người luôn không đồng bộ :-(
Ciro Santilli 冠状 六四 30/11/18

1
@CiroSantilli新疆改造中心法轮功六四事件Santilli git lệnh (như commit, fetch, pull, vv) được thiết kế để chỉ được áp dụng cho các kho lưu trữ hiện hành. một mô hình con là một kho lưu trữ khác và không bị ảnh hưởng bởi các lệnh được thực thi trong kho mẹ theo mặc định. đây là một loại quyết định thiết kế của nhà phát triển git.
anion

113

git config --global alias.pullall '!git pull && git submodule update --init --recursive'

Nếu bạn muốn các đối số được chuyển đến git pull, thì hãy sử dụng thay thế này:

git config --global alias.pullall '!f(){ git pull "$@" && git submodule update --init --recursive; }; f'

4
nhớ sử dụng "git config --global" nếu bạn muốn bí danh này trên tất cả các repo git bạn sử dụng
yoyo

43

Bắt đầu với Git 1.7.5, nó sẽ tự động cập nhật các mô hình con theo mặc định như bạn muốn.

[EDIT: mỗi nhận xét: các hành vi 1.7.5 mới là để tự động lấy các cam kết mới nhất cho các môđun con, nhưng không để cập nhật chúng (trong git submodule updateý nghĩa). Vì vậy, thông tin trong câu trả lời này có liên quan làm nền, nhưng bản thân nó không phải là một câu trả lời hoàn chỉnh. Bạn vẫn cần một bí danh để kéo và cập nhật các mô hình con trong một lệnh.]

Hành vi mặc định, "theo yêu cầu", là cập nhật các mô hình con bất cứ khi nào bạn tìm nạp một cam kết cập nhật cam kết mô hình con và cam kết này không được đặt trong bản sao cục bộ của bạn.
Bạn cũng có thể cập nhật nó trên mỗi lần tìm nạp hoặc không bao giờ (hành vi trước 1.7.5 tôi giả sử).
Tùy chọn cấu hình để thay đổi hành vi này là fetch.recurseSubmodules.

Tùy chọn này có thể được đặt thành giá trị boolean hoặc thành on-demand.
Đặt nó thành boolean sẽ thay đổi hành vi fetchpulltái phát vô điều kiện thành các mô hình con khi được đặt thành true hoặc hoàn toàn không lặp lại khi được đặt thành false.

Khi được đặt thành on-demand(giá trị mặc định) fetchpull sẽ chỉ lặp lại thành một mô hình con được điền khi siêu dự án của nó truy xuất một cam kết cập nhật tham chiếu của mô hình con .

Xem:

để biết thêm thông tin.

git fetch --recurse-submodules[=yes|on-demand|no]

27
Xem ra: như các câu trả lời dưới đây giải thích, điều này chỉ tự động tìm nạp các thay đổi, bạn vẫn phải thực hiện cập nhật mô hình con - vì vậy câu trả lời bí danh là đúng.
Artem

4
@Artem là chính xác. Câu trả lời này, mặc dù hữu ích, không giải quyết toàn bộ câu hỏi. Cài đặt này chỉ đơn giản là thực hiện a git fetch, không phải a git submodule update.
Andrew Ferrier

2
Câu trả lời này rất lừa dối. Ngay cả khi được sử dụng với git pull, thay vì git fetch, tùy chọn này chỉ làm cho việc tìm nạp đệ quy. Nó sẽ không thay đổi những gì cam kết được kiểm tra trong các mô hình con. Vì vậy, git submodule updatevẫn cần thiết, như được lưu ý bởi @Artem.
Mark Amery

31

Tôi ngạc nhiên không ai đề cập đến việc sử dụng git hook để làm điều này!

Chỉ cần thêm các tệp có tên post-checkoutpost-mergevào .git/hooksthư mục của bạn trong kho lưu trữ có liên quan và đặt các mục sau vào mỗi tệp:

#!/bin/sh
git submodule update --init --recursive

Vì bạn đặc biệt yêu cầu một bí danh, giả sử bạn muốn có cái này cho nhiều kho lưu trữ, bạn có thể tạo một bí danh để thêm chúng vào kho lưu trữ .git/hookscho bạn.


2
Có cách nào để làm cho điều này một thiết lập toàn cầu? Hoặc một trong những bạn nhận được tự động khi kiểm tra kho lưu trữ?
Raoul Steffen

3
Bản phát hành mới nhất của git, 2.9, đã thêm một cài đặt được đặt tên core.hooksPathcho thư mục hook , xem tài liệu git-configđể biết thêm chi tiết.
taleinat

1
Đối với một cái gì đó nhận được tự động khi kiểm tra, tôi đã tìm kiếm nhưng không thể tìm thấy bất cứ thứ gì thuộc loại này. Một nguồn đề cập rằng điều này không được hỗ trợ cho các vấn đề bảo mật, vì nó có thể dễ dàng được sử dụng để chạy mã tùy ý trên các máy khách.
taleinat

1
Tôi thấy làm thế nào đó có thể là một vấn đề bảo mật. Rốt cuộc, tôi muốn sử dụng nó để chạy mã tôi lập trình trên máy tính của đồng nghiệp mà không cần phải hướng dẫn họ.
Raoul Steffen

1
Giải pháp này là suy nghĩ đầu tiên của tôi, nhưng sau đó tôi nhận ra nó sẽ không bao gồm những người sử dụng git pull --rebase:(
Vaz

8

Một bí danh, theo đề xuất của Kevin Ballard, là một giải pháp hoàn toàn tốt. Chỉ cần ném một tùy chọn khác ra khỏi đó, bạn cũng có thể sử dụng một hook post-merge chỉ đơn giản là chạy git submodule update [--init].


7

Bạn có thể tạo bí danh cho lệnh git tự động xử lý cập nhật mô hình con. Thêm phần sau vào .bashrc của bạn

# make git submodules usable
#   This overwrites the 'git' command with modifications where necessary, and
#   calls the original otherwise
git() {
    if [[ $@ == clone* ]]; then
        gitargs=$(echo "$@" | cut -c6-)
        command git clone --recursive $gitargs
    elif [[ $@ == pull* ]]; then
        command git "$@" && git submodule update --init --recursive
    elif [[ $@ == checkout* ]]; then
        command git "$@" && git submodule update --init --recursive
    else
        command git "$@"
    fi
}

1
Thay vì bí danh cho git, bạn có thể thêm bí danh để git thông qua lệnh bí danh hoặc bằng cách tạo các lệnh trong đường dẫn của bạn bắt đầu bằng git- (git-bettermodule)
idbrii

7

Như những người khác đã đề cập, bạn có thể dễ dàng thiết lập điều này với:

git config --global submodule.recurse true

Tuy nhiên, nếu bạn giống tôi và có .gitconfigthiết lập phức tạp hơn ( ~/.gitconfigtệp chính của tôi sử dụng includeđể tải các .gitconfigtệp khác ) và bạn không bao giờ có thể nhớ cách chuyển đổi giữa gitđịnh dạng cấu hình dòng lệnh và .gitconfigđịnh dạng, đây là cách thêm nó vào cho bất kỳ .gitconfigtệp nào của bạn :

[submodule]
  recurse = true

0

Chỉ có cách tôi có thể nhận được các mô hình con và các mô hình con lồng nhau để cập nhật:

git submodule update --remote --merge --recursive; git submodule foreach --recursive "(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);" git add .; git commit -m 'SubmodulesSynced'; git push; git pull;

Tôi đã vật lộn để tạo bí danh thông qua thiết bị đầu cuối do dấu ngoặc nên tôi phải thêm thủ công này vào .gitconfig cho toàn cầu:

[alias] supdate = "!git submodule update --remote --merge --recursive; git submodule foreach --recursive '(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);' git add .; git commit -m 'SubmodulesSynced'; git push; git pull;"

Bất kỳ đề xuất cho cách chạy các lệnh hoặc bí danh tự động?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.