Có cách nào để tự động có git submodule update
(hoặc tốt nhất git submodule update --init
là 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.
Có cách nào để tự động có git submodule update
(hoặc tốt nhất git submodule update --init
là 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.
Câu trả lời:
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.recurse
thà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
git pull
cho 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ờ
git config --global submodule.recurse true
git clone
là 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ộ :-(
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.
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'
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 vifetch
vàpull
tá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)fetch
vàpull
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:
git config
trang man (1.7.5) (hoặc git config
trang man mới nhất )git fetch
trang man (1.7.5) (hoặc trang git fetch mới nhất )để biết thêm thông tin.
git fetch --recurse-submodules[=yes|on-demand|no]
git fetch
, không phải a git submodule update
.
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 update
vẫn cần thiết, như được lưu ý bởi @Artem.
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-checkout
và post-merge
vào .git/hooks
thư 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/hooks
cho bạn.
core.hooksPath
cho thư mục hook , xem tài liệu git-config
để biết thêm chi tiết.
git pull --rebase
:(
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
}
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ó .gitconfig
thiết lập phức tạp hơn ( ~/.gitconfig
tệp chính của tôi sử dụng include
để tải các .gitconfig
tệ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ỳ .gitconfig
tệp nào của bạn :
[submodule]
recurse = true
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?