2011-01-06 26 views
108

Có cách nào để tự động có git submodule update (hoặc tốt hơn là git submodule update --init gọi bất cứ khi nào git pull được thực hiện?Có cách nào để làm cho git pull tự động cập nhật submodules không?

Looking for a thiết lập git config, hoặc một bí danh git để giúp với điều này.

+3

Liên quan: http://stackoverflow.com/questions/1899792/why-is-git-submodule-update-not-automatic – philfreo

+0

Tại sao bí danh git thích hợp hơn với bí danh vỏ? – wnoise

+14

bí danh git rất đẹp vì nó đóng gói 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 chúng. –

Trả lời

99

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, sau đó sử dụng nó để thay thế:

git config --global alias.pullall '!f(){ git pull "[email protected]" && git submodule update --init --recursive; }; f' 
+3

hãy 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

8

Một bí danh, theo đề xuất của Kevin Ballard, là một giải pháp hoàn hảo 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 móc hậu hợp nhất mà chỉ cần chạy git submodule update [--init].

39

Bắt đầu với Git 1.7.5, nên tự động cập nhật mô-đun phụ 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 mới nhất cam kết cho các môđun con, nhưng không-cập nhật họ (theo nghĩa git submodule update). Vì vậy, thông tin trong câu trả lời này có liên quan như là nền tảng, nhưng không phải là một câu trả lời hoàn chỉnh của chính nó. Bạn vẫn cần một bí danh để kéo và cập nhật các mô-đun 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ô-đun con bất cứ khi nào bạn tìm nạp cam kết cập nhật giao thức 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 mà tôi giả định).
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 on-demand.
Đặt nó thành một thay đổi boolean hành vi của fetchpull để recurse theo cách vô điều kiện thành các mô-đun con khi được đặt thành true hoặc không hoàn toàn chấp nhận khi được đặt thành false.

Khi thiết lập để on-demand (giá trị mặc định), fetchpullsẽ chỉ recurse vào một submodule dân cư khi superproject của nó lấy một cam kết rằng cập nhật của submodule tham khảo.

Xem:

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

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

Xem ra: như câu trả lời dưới đây giải thích, điều này chỉ tự động thay đổi, bạn vẫn phải cập nhật submodule - 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ỉ thực hiện 'git fetch', không phải là' git submodule update'. –

+2

Câu trả lời này rất lừa đảo. 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 * fetching * đệ quy. Nó sẽ không thay đổi những gì cam kết được kiểm tra trong submodules ở tất cả. Vì vậy, 'git submodule update' vẫn còn cần thiết, như được ghi chú bởi @Artem. –

3

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

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

Thay vì một 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

21

Tôi ngạc nhiên không ai đề cập đến việc sử dụng git hooks để thực hiện việc này!

Chỉ cần thêm tập tin có tên post-checkoutpost-merge vào thư mục .git/hooks của bạn trong những kho có liên quan, và đặt sau đây vào mỗi trong số họ:

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

Vì bạn specfically hỏi cho một bí danh, giả sử bạn muốn có này đối với nhiều kho lưu trữ, bạn có thể tạo bí danh bổ sung thêm bí danh này cho một kho lưu trữ của .git/hooks cho bạn.

+0

Có cách nào để làm cho cài đặt này thành toàn cầu không? Hoặc bạn nhận được tự động khi kiểm tra kho lưu trữ? –

+0

Phiên bản mới nhất của git, 2.9, đã [thêm một cài đặt có tên 'core.hooksPath' cho một thư mục móc] (https://github.com/blog/2188-git-2-9-has-been-released# git-tidbits-gitbits-tidgits), xem tài liệu cho 'git-config' để biết thêm chi tiết. – taleinat

+0

Đối với một cái gì đó nhận được tự động khi kiểm tra ra, tôi tìm kiếm nhưng không thể tìm thấy bất cứ điều gì của loại. Một nguồn đã đề cập rằng điều này cố ý 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

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