有没有一种方法可以自动拥有git submodule update
(或最好git submodule update --init
在git pull
完成后立即调用?
寻找一个git config设置或一个git别名来帮助解决这个问题。
有没有一种方法可以自动拥有git submodule update
(或最好git submodule update --init
在git pull
完成后立即调用?
寻找一个git config设置或一个git别名来帮助解决这个问题。
Answers:
从Git 2.14开始,您可以使用git pull --recurse-submodules
(并为其加上别名)。
从Git 2.15开始,您可以设置submodule.recurse
为true以启用所需的行为。
您可以通过运行以下命令全局执行此操作:
git config --global submodule.recurse true
git pull
也获取子模块并运行submodule update
。现在确实需要接受这个答案
git config --global submodule.recurse true
git clone
。并默认启用它。否则,由于子模块总是不同步,因此使用子模块总是会有巨大的阻力:-(
commit
,fetch
,pull
等)被设计成仅适用于当前存储库。子模块是另一个存储库,默认情况下,子模块不应受到在父存储库中执行的命令的影响。这是git-developer的一种设计决策。
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'
从Git 1.7.5开始,它将默认自动更新子模块,如您所愿。
[编辑:每条评论:1.7.5的新行为是自动获取子模块的最新提交,但不自动以更新他们(在git submodule update
意义上的)。因此,此答案中的信息与背景相关,但其本身并不是完整的答案。您仍然需要一个别名才能在一个命令中提取和更新子模块。]
默认行为“按需”是每当您获取用于更新子模块提交的提交,而该提交尚未位于本地克隆中时,都会更新子模块。
您也可以使它在每次获取时都更新,也可以从不更新(我假设1.7.5之前的行为)。
更改此行为的config选项为fetch.recurseSubmodules
。
此选项可以设置为布尔值或
on-demand
。
将其设置为布尔值会更改行为,fetch
并且pull
在设置为true时无条件递归到子模块,或者在设置为false时完全不递归。当设置为
on-demand
(默认值),fetch
和pull
仅在其超级项目检索更新该子模块引用的提交时才递归到填充的子模块中。
看到:
想要查询更多的信息。
git fetch --recurse-submodules[=yes|on-demand|no]
git fetch
,而不执行git submodule update
。
git pull
,而不是与一起使用git fetch
,此选项也只能使获取递归。它根本不会改变在子模块中检出的提交。因此,git submodule update
仍然是必要的,如@Artem指出。
我很惊讶没有人提到使用git hooks来做到这一点!
只需将名为post-checkout
和的文件添加post-merge
到.git/hooks
相关存储库的目录中,然后将以下文件放入每个存储库中:
#!/bin/sh
git submodule update --init --recursive
由于您是专门要求别名的,因此假设您想在许多存储库中使用该别名,则可以创建一个别名,将其添加到您的存储库中.git/hooks
。
core.hooksPath
hooks目录的设置,git-config
有关更多详细信息,请参阅文档。
git pull --rebase
:(
您可以为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 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;"
关于如何自动运行命令或别名的任何建议?