我有一个git存储库,它使用一个子模块,我想指向一个带注释的标签,但是当我做git submodule update
时,新的标签不会被提取。我可以通过cd进入子模块并在那里进行git fetch --tags
来获取子模块中的新标签,但我真的很想从外部完成所有这些,因为它是脚本化的。
我在git文档中找不到任何建议让git submodule update
包含标记的方法(我的git版本是1.7.3.5)。
显然还有另一种可能性 - 将子模块指向标签所指向的提交而不是标签本身,但这看起来并不整齐。
有没有办法让git submodule update
包含标签?
答案 0 :(得分:17)
这里的答案很晚,但我很惊讶没有人提到git submodule foreach
。这基本上就是我解决你遇到的确切问题的方式:
git submodule foreach --recursive 'git fetch --tags'
git submodule update --recursive
--recursive
标志用于递归子子模块。
答案 1 :(得分:7)
git submodule
是作为shell脚本实现的,因此很容易看到它正在做什么 - 如果您使用的是打包版本,它可能位于/usr/lib/git-core/git-submodule
。基本上它只是在子模块中运行git-fetch
,如果它存储在主项目树中的对象名称(SHA1sum)与子模块中签出的版本不匹配,则为Koraktor points out。
documentation for git fetch
(或man git-fetch
而kernel.org已关闭)表示它应该获取指向下载对象的每个标记,并且下载的对象将包括每个提交的每个提交。获取的分支。这意味着我很惊讶你没有在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
”子模块“,它最终只会存储与该标签相对应的哈希...
答案 2 :(得分:3)
git submodule update
无法获取任何内容。所以这可能是一种误解。
git submodule update
会将存储库中子模块的工作目录内容带到已定义的状态(即检查已在存储库中定义的子模块提交)。
更好的方法是cd
进入您的子模块(这是一个Git存储库本身),只需运行git fetch --tags
然后git checkout some-tag
。之后,子模块已在您的工作目录中更新为some-tag
,您可以将其暂存以进行提交。
答案 3 :(得分:0)
您可以编写脚本,以便执行(cd path-to-submod && git fetch)
将命令包装在括号中会将环境放在子shell中,这意味着您无需将CD返回到您所在的位置。
希望这有帮助