git submodule
被实现为一个 shell 脚本,所以很容易看到它在做什么——/usr/lib/git-core/git-submodule
如果你使用的是打包版本,它可能会在。本质上,git-fetch
如果存储在主项目树中的对象名称(SHA1sum)与在子模块中签出的版本不匹配,它只会在子模块中运行,正如Koraktor 指出的那样。
(或当 kernel.org 关闭时)的文档git fetch
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
,以防您的标签不是指向下载提交的标签。)
显然还有另一种可能性 - 将子模块指向标签指向的提交而不是标签本身,但这似乎并不整洁。
好吧,子模块的主项目树中存储的唯一东西就是提交对象的哈希,所以即使有一个命令说“将我的子模块设置为那个子模块中的标签my-tag
”,它最终只会无论如何存储与该标签对应的哈希...