21

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

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

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

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

4

4 回答 4

22

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

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

--recursive标志在那里递归到子子模块。

于 2012-09-05T15:18:42.830 回答
13

git submodule被实现为一个 shell 脚本,所以很容易看到它在做什么——/usr/lib/git-core/git-submodule如果你使用的是打包版本,它可能会在。本质上,git-fetch如果存储在主项目树中的对象名称(SHA1sum)与在子模块中签出的版本不匹配,它只会在子模块中运行,正如Koraktor 指出的那样

(或当 kernel.org 关闭时)的文档git fetchman 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 ,以防您的标签不是指向下载提交的标签。)

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

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

于 2011-09-22T06:32:39.197 回答
5

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

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

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

于 2011-09-21T18:21:16.877 回答
0

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

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

希望这可以帮助

于 2011-09-21T17:51:22.947 回答