有没有办法让git pull自动更新子模块?

时间:2011-01-06 03:39:54

标签: git git-submodules

有没有办法在git submodule update完成后自动调用git submodule update --init(或最好是git pull

寻找git配置设置或git别名来帮助解决此问题。

8 个答案:

答案 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   将其设置为布尔值会将fetchpull的行为更改为在设置为true时无条件地递归到子模块或在设置为false时完全不递归。

     

当设置为on-demand(默认值)时,fetchpull 只会在其超级项目检索更新子模块引用的提交时递归到填充的子模块中< / strong>即可。

请参阅:

了解更多信息。

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

答案 3 :(得分:28)

我很惊讶没有人提到使用git hooks来做到这一点!

只需将名为post-checkoutpost-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;"

关于如何自动运行命令或别名的任何建议?