【问题标题】:Can git submodule update be made to fetch tags in submodules?可以进行 git submodule update 以获取子模块中的标签吗?
【发布时间】:2011-11-21 23:29:47
【问题描述】:

我有一个 git 存储库,它使用一个子模块,我想指向一个带注释的标签,但是当我这样做 git submodule update 时,不会获取新标签。我可以通过 cd-ing 进入子模块并在那里执行git fetch --tags 来获取子模块中的新标签,但我真的很想从外部执行所有这些操作,因为它是脚本化的。

我在 git 文档中找不到任何建议让 git submodule update 包含标签的方法(我的 git 版本是 1.7.3.5)。

显然还有另一种可能性 - 将子模块指向标记指向的提交而不是标记本身,但这似乎并不整洁。

有没有办法让git submodule update 包含标签?

【问题讨论】:

    标签: git git-submodules git-tag


    【解决方案1】:

    这里的答案迟了,但我很惊讶没有人提到git submodule foreach。这基本上是我解决您遇到的确切问题的方式:

    git submodule foreach --recursive 'git fetch --tags'
    git submodule update --recursive
    

    --recursive 标志可以递归到子子模块中。

    【讨论】:

      【解决方案2】:

      git submodule 是作为 shell 脚本实现的,因此很容易看到它在做什么——如果您使用的是打包版本,它可能位于 /usr/lib/git-core/git-submodule。本质上,它只是在子模块中运行git-fetch,如果存储在主项目树中的对象名称(SHA1sum)与在子模块中签出的版本不匹配,如Koraktor points out

      documentation for git fetch(或 kernel.org 关闭时的man git-fetch)表示它应该获取指向下载对象的每个标签,并且下载的对象将包括作为所获取的每个分支的祖先的每个提交。这意味着我很惊讶您没有在git submodule update 上获得所有相关标签。

      如果您的脚本真正想要的是尝试设置一个新的子模块版本并提交该结果,我认为git submodule update 不是您想要的工具 - 那只是为了制作根据当前主项目提交中的内容,确保您的子模块处于正确的版本。相反,您应该执行以下操作:

      ( cd my-submodule && \
            git fetch && \
            git fetch --tags && \
            git checkout my-tag )
      git add my-submodule
      git commit -m 'Update the submodule to the "my-tag" version' my-submodule
      

      (我添加了一个额外的 git fetch --tags just in case 你的标签不是指向下载提交的标签。)

      显然还有另一种可能性 - 将子模块指向标签指向的提交而不是标签本身,但这似乎并不整洁。

      嗯,在主项目树中存储的唯一内容就是子模块的提交对象的哈希,所以即使有一个命令说“将我的子模块设置为该子模块中的标签my-tag” ,它最终只会存储与该标签对应的哈希......

      【讨论】:

      • 感谢您的所有帮助 - 看起来我的问题是我想要的提交不在任何分支的历史记录中。你认为git submodule update 只做git fetch 而不是git fetch --tags 有充分的理由吗?添加git fetch --tags 可以为将来遇到此问题的任何人解决此问题。当 kernel.org 备份时,我会找地方报告这个。
      • @DuncanParkes 从 git 1.9/2.0(2014 年第一季度)开始,git fetch --tags 就足够了(无需添加 git fetch):stackoverflow.com/a/20608181/6309
      【解决方案3】:

      git submodule update 如果您的子模块是最新的,则不会获取任何内容。所以这可能是一个误解。

      git submodule update 会将存储库中子模块的工作目录内容带入已定义状态(即检查已在存储库中定义的子模块提交)。

      更好的方法是将cd 放入您的子模块(它本身就是一个Git 存储库),然后简单地运行git fetch --tags,然后运行git checkout some-tag。之后,您的工作目录中的子模块已更新为some-tag,您可以暂存它以进行提交。

      【讨论】:

      • 你说得对,我确实有这种误解,但这不是我的主要问题,即当我在其他地方签出并执行时,将子模块设置为指向标签提交git submodule update,它抱怨找不到提交。我已经决定指向标记提交的父级。
      【解决方案4】:

      您可以编写脚本以便执行(cd path-to-submod && git fetch)

      将命令包装在方括号中会将环境置于子外壳中,这意味着您不必将 CD 恢复到原来的位置。

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 2021-01-06
        • 1970-01-01
        • 1970-01-01
        • 2022-12-08
        • 1970-01-01
        • 2023-02-26
        • 2013-11-06
        • 2016-02-21
        • 2014-10-10
        相关资源
        最近更新 更多