我能否在切换分支时让git自动更新子模块?

5

我正在处理一个包含子模块的git仓库,不同分支上的子模块版本可能不同。当我切换分支时,会出现以下提示:

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

信息。然后我手动执行:

git submodule update --recursive

但那就消失了。

我尝试编写一个 git 钩子,放置于 .git/hooks/post-checkout:

#!/bin/bash

exec git submodules update --recursive

但似乎这并没有做任何事情。我尝试添加一个exec echo hello from post-hook的命令行——效果看起来也不好。

我的问题是:是否可以配置git,以便分支检出本身默认也会更新子模块?

2个回答

4
如果您的 git 版本是 2.13 或更高版本,请尝试使用选项 --recurse-submodules
git checkout another-branch --recurse-submodules

在某些情况下,您可能需要添加-f

3
我尝试在.git/hooks/post-checkout中编写git钩子:
检查您是否正确拼写了钩子的名称,并且该钩子具有可执行标志(如果没有, git 应该会给您警告)。
您在发布的脚本中有一个拼写错误:在 submodule 结尾处不应该有 s 。也许这只是您发布的错误,但如果在实际钩子中出现错误,运行钩子时应该会看到错误消息,而您没有看到的事实(以及您的 echo 不起作用)表明该钩子根本没有运行。
如果您没有上面提到的拼写错误,并且如果您的钩子中 echo 语句确实起作用,则并不奇怪您看不到 git submodule update 行做任何事情-如果您项目中的子模块已经匹配分支中指定的提交,则该命令不会输出任何内容。只有在需要更新子模块时才会看到输出。还要记住, git submodule update 不获取子模块的最新版本,它获取您在项目中提交的那些版本。
总的来说,您的想法是正确的:您绝对可以向 .git/hooks/ 添加名为 post-checkout 的钩子,每当您成功 git checkout 一些分支时,它都应该运行。

1
我没有将钩子脚本设为可执行文件。在这样做之后,钩子就可以正常工作了。 - einpoklum
在这种情况下,您可能想要运行 git config advice.ignoredHook true。它会在钩子未被执行时发出警告,因此您将不会再次遇到这个问题(至少在这个仓库中)。 - Caleb
说实话,如果我足够了解设置那个配置参数,我也可以正确地获取钩子... - einpoklum
直到 Git 2.16 版本才出现此功能,因此您需要更新您的 git。如果您这样做了,它应该会默认开启。 - Caleb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接