【问题标题】:Can I make git automatically update submodules when checking out a branch?签出分支时,我可以让 git 自动更新子模块吗?
【发布时间】:2019-09-02 00:11:39
【问题描述】:

我正在开发一个带有一些子模块的 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 以便分支结帐本身也会更新子模块,默认情况下?

【问题讨论】:

  • @Liam:看我的回答。

标签: git git-submodules git-checkout


【解决方案1】:

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

git checkout another-branch --recurse-submodules

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

【讨论】:

    【解决方案2】:

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

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

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

    如果你没有上面提到的错字,并且如果你的钩子中的 echo 语句 do 有效,那么你看不到你的 git submodule update 行做任何事情也就不足为奇了——如果项目中的子模块已经与分支中指定的提交匹配,则该命令不会提供任何输出。您唯一会看到输出的情况是是否有一个实际上需要更新的子模块。还要记住git submodule updatedoesn't get the latest versions of the submodules,它会获取您在项目中提交的那些。

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

    【讨论】:

    • 我没有使钩子脚本可执行。之后 - 钩子起作用了。
    • 在这种情况下,您可能需要运行 git config advice.ignoredHook true。当一个钩子没有运行时它会打开一个警告,因为它不是可执行的,所以你不会再遇到这个问题(至少在这个 repo 中)。
    • TBH,如果我知道足以设置该配置参数,我可能无论如何都能得到正确的钩子......
    • 它直到 git 2.16 才出现,所以无论如何你都需要更新你的git,如果你这样做,它应该默认打开。
    猜你喜欢
    • 2018-10-15
    • 2019-08-09
    • 1970-01-01
    • 2011-06-27
    • 2014-06-23
    • 2011-05-18
    • 1970-01-01
    • 2018-07-05
    相关资源
    最近更新 更多