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

Can I make git automatically update submodules when checking out a branch?

我正在开发一个包含一些子模块的 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

但这似乎没有任何作用。我试图从 post-hook 行添加一个 exec echo hello - 似乎也不起作用。

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

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

git checkout another-branch --recurse-submodules

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

I tried writing a git hook, in .git/hooks/post-checkout:

检查你是否正确拼写了钩子的名称,并且钩子有可执行标志(如果没有,git 应该给你一个警告)。

您发布的脚本中有错字:submodule 末尾不应有 s。也许这只是你发布的错误,但如果它在你的实际挂钩中,你应该在挂钩 运行s 时看到一条错误消息,而事实上你没有看到(而且你的 echo 不起作用)表明挂钩根本不是 运行ning。

如果您没有上面提到的拼写错误,并且如果您的钩子中的 echo 语句 工作,那么您看不到您的就不足为奇了git submodule update line doing anything — 如果项目中的子模块已经与分支中指定的提交相匹配,则该命令不会给出任何输出。您唯一会看到输出的情况是是否存在实际需要更新的子模块。还要记住 git submodule update doesn't get the latest versions of the submodules,它会获取您在项目中提交的内容。

总的来说,您的想法是正确的:您绝对可以将一个名为 post-checkout 的钩子添加到 .git/hooks/,并且只要您成功 git checkout 它就应该 运行 ] 一些分支。