有没有办法在git submodule update
完成后自动调用git submodule update --init
(或最好是git pull
?
寻找git配置设置或git别名来帮助解决此问题。
答案 0 :(得分:110)
git config --global alias.pullall '!git pull && git submodule update --init --recursive'
如果你想将参数传递给git pull,那么请改用:
git config --global alias.pullall '!f(){ git pull "$@" && git submodule update --init --recursive; }; f'
答案 1 :(得分:93)
从git 2.14开始,您可以将submodule.recurse
设置为true以启用所需的行为。
您可以通过运行:
全局执行此操作git config --global submodule.recurse true
答案 2 :(得分:42)
从Git 1.7.5开始,它应该像你想要的那样自动更新子模块。
[编辑:根据评论:新的1.7.5行为是自动获取子模块的最新提交,但不到更新他们(在git submodule update
意义上)。所以这个答案中的信息与背景相关,但本身并不是一个完整的答案。您仍然需要一个别名来在一个命令中提取和更新子模块。]
默认行为“按需”是每当您获取更新子模块提交的提交时更新子模块,并且此提交尚未位于您的本地克隆中。
您也可以在每次获取或从不更新时更新(我假设的1.7.5之前的行为)
用于更改此行为的配置选项为 fetch.recurseSubmodules
。
此选项可以设置为布尔值,也可以设置为
on-demand
将其设置为布尔值会将fetch
和pull
的行为更改为在设置为true时无条件地递归到子模块或在设置为false时完全不递归。当设置为
on-demand
(默认值)时,fetch
和pull
只会在其超级项目检索更新子模块引用的提交时递归到填充的子模块中< / strong>即可。
请参阅:
git config
man page (1.7.5)(或最新git config
man page)git fetch
man page (1.7.5)(或最新git fetch man page)了解更多信息。
git fetch --recurse-submodules[=yes|on-demand|no]
答案 3 :(得分:28)
我很惊讶没有人提到使用git hooks来做到这一点!
只需将名为post-checkout
和post-merge
的文件添加到相关存储库的.git/hooks
目录中,然后将以下内容添加到每个目录中:
#!/bin/sh
git submodule update --init --recursive
由于您明确要求别名,假设您希望为多个存储库提供此别名,您可以创建一个别名,将这些别名添加到存储库的.git/hooks
。
答案 4 :(得分:8)
凯文巴拉德建议的别名是一个非常好的解决方案。只是为了抛出另一个选项,你也可以使用合并后的钩子,只需运行git submodule update [--init]
。
答案 5 :(得分:5)
您可以为自动处理子模块更新的git命令创建别名。将以下内容添加到.bashrc
# 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
}
答案 6 :(得分:4)
正如其他人所提到的,您可以使用以下方法轻松设置:
git config --global submodule.recurse true
但是,如果您像我一样,并且拥有更复杂的.gitconfig
设置(我的主~/.gitconfig
文件使用include
来加载其他.gitconfig
文件),并且您永远都不记得如何在命令行git
配置格式和.gitconfig
格式之间进行转换,这是将其添加到您的.gitconfig
文件中的任何一种的方法:
[submodule]
recurse = true
答案 7 :(得分:0)
只有这样才能使子模块和嵌套子模块更新:
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;
由于括号,我一直在努力通过终端创建别名,所以我不得不手动将其添加到.gitconfig中以进行全局操作:
[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;"
关于如何自动运行命令或别名的任何建议?