有办法自动有git子模块更新(或最好是git子模块更新——init调用每当git拉?

寻找一个git配置设置,或一个git别名来帮助这一点。


当前回答

Git配置——全局别名。pullall”!Git pull && Git子模块更新——init——递归

如果你想把参数传递给git pull,那么使用下面的代码:

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

其他回答

Git配置——全局别名。pullall”!Git pull && Git子模块更新——init——递归

如果你想把参数传递给git pull,那么使用下面的代码:

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

Kevin Ballard建议的别名是一个非常好的解决方案。只是抛出另一个选项,你也可以使用post-merge钩子,它只运行git子模块update[——init]。

从Git 1.7.5开始,默认情况下它应该像你希望的那样自动更新子模块。

[EDIT: per comments:新的1.7.5行为是自动获取子模块的最新提交,但不更新它们(在git子模块更新的意义上)。所以这个答案中的信息是相关的背景,但它本身并不是一个完整的答案。您仍然需要一个别名来在一个命令中提取和更新子模块。]

默认的行为,“按需”,是每当你获取一个更新子模块提交的提交时更新子模块,并且这个提交还没有位于你的本地克隆中。 你也可以在每次读取时更新它,或者从不更新(我假设是1.7.5之前的行为)。 改变这种行为的配置选项是fetch.recurseSubmodules。

此选项可以设置为布尔值,也可以按需设置。 将其设置为布尔值将改变fetch和pull的行为,使其在设置为true时无条件递归到子模块中,或在设置为false时完全不递归。 当设置为按需(默认值)时,fetch和pull只会在已填充的子模块的超项目检索更新子模块引用的提交时递归到子模块中。

See:

Git配置手册页(1.7.5)(或最新的Git配置手册页) Git获取手册页(1.7.5)(或最新的Git获取手册页)

获取更多信息。

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

您可以为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
}

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

只需将名为post-checkout和post-merge的文件添加到相关存储库的.git/hooks目录中,并将以下文件放入每个文件中:

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

由于您特别要求一个别名,假设您希望为许多存储库使用这个别名,您可以创建一个别名,将这些别名添加到存储库的.git/hooks中。