签出分支时可以使git自动更新子模块吗?

时间:2019-04-11 11:10:47

标签: git git-submodules git-checkout

我正在使用带有一些子模块的git存储库,这些子模块在不同的分支上具有不同的修订版。当我切换分支时,我得到一个:

M          path/to/subrepo
Switched to branch 'another-branch'

消息。然后,我手动执行以下操作:

git submodule update --recursive

然后消失了。

我尝试在.git / hooks / post-checkout中编写一个git钩子:

#!/bin/bash

exec git submodules update --recursive

但是这似乎没有任何作用。我试图从挂机后行添加exec echo hello-似乎也不起作用。

我的问题:默认情况下,我可以配置git以便分支检出本身也更新子模块吗?

2 个答案:

答案 0 :(得分:1)

如果您的git版本是2.13或更高版本,请尝试选项--recurse-submodules

user-agents

在某些情况下,您可能还需要添加git checkout another-branch --recurse-submodules

答案 1 :(得分:1)

  

我尝试在.git / hooks / post-checkout中编写一个git钩子:

检查您是否正确拼写了该挂钩的名称,并且该挂钩具有可执行标志(git应该向您发出警告,如果没有)。

您在发布的脚本中输入错误:s的末尾不应有submodule。也许这只是您发布的内容中的一个错误,但是如果它在您的实际挂钩中,则在该挂钩运行时您会看到一条错误消息,并且您实际上没有(并且您的echo无法正常工作) )表明该挂钩根本没有运行。

如果您没有上述错别字,并且钩子中的echo语句可以正常工作,那么您没看到git submodule update也就不足为奇了行执行任何操作-如果项目中的子模块已经与分支中指定的提交匹配,则该命令不会提供任何输出。您唯一看到的输出是是否确实有一个子模块需要实际更新。还请记住,git submodule update doesn't get the latest versions of the submodules会得到您在项目中提交的内容。

总的来说,您有个正确的主意:可以在post-checkout上添加一个名为.git/hooks/的钩子,并且只要您成功git checkout某个分支,它就应该运行。