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

ein*_*ica 5 git git-checkout git-submodules

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

M          path/to/subrepo
Switched to branch 'another-branch'
Run Code Online (Sandbox Code Playgroud)

信息。然后我手动执行:

git submodule update --recursive
Run Code Online (Sandbox Code Playgroud)

然后这种情况就消失了。

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

#!/bin/bash

exec git submodules update --recursive
Run Code Online (Sandbox Code Playgroud)

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

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

Elp*_*Kay 5

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

git checkout another-branch --recurse-submodules
Run Code Online (Sandbox Code Playgroud)

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


Cal*_*leb 3

\n

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

\n
\n\n

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

\n\n

您发布的脚本中有一个拼写错误:s结尾不应该有submodule。也许这只是您发布的内容中的一个错误,但如果它在您的实际挂钩中,您应该在挂钩运行时看到一条错误消息,而事实上您没有(而且您的挂钩也echo没有) 't work) 表明该挂钩根本没有运行。

\n\n

如果您没有上面提到的拼写错误,并且echo您的钩子中的 if 语句确实有效,那么您看不到您的git submodule update行执行任何该命令不执行的操作就不足为奇了如果项目中的子模块已经与分支中指定的提交匹配,则不会给出任何输出。您唯一会看到输出的情况是是否存在实际需要更新的子模块。另请记住,它git submodule update 不会获取子模块的最新版本,而是获取您在项目中提交的子模块。

\n\n

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

\n