Dun*_*kes 17 git git-submodules git-tag
我有一个git存储库,它使用一个子模块,我想指向一个带注释的标签,但是当我做git submodule update新的标签时,不会被提取.我可以通过cd进入子模块并在git fetch --tags那里做一个子模块中的新标签,但我真的很想从外部完成所有这些,因为它是脚本化的.
我在git文档中找不到任何建议git submodule update包含标记的方法(我的git版本是1.7.3.5).
显然还有另一种可能性 - 将子模块指向标签指向的提交而不是标签本身,但这看起来并不整齐.
有没有办法git submodule update包含标签?
jsd*_*ton 18
迟到的答案在这里,但我很惊讶,没有人提到git submodule foreach.这基本上是我解决你遇到的确切问题的方式:
git submodule foreach --recursive 'git fetch --tags'
git submodule update --recursive
Run Code Online (Sandbox Code Playgroud)
--recursive flag是否可以递归到子子模块中.
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
Run Code Online (Sandbox Code Playgroud)
(我添加了一个额外的git fetch --tags ,以防您的标记不是指向下载提交的标记.)
显然还有另一种可能性 - 将子模块指向标签指向的提交而不是标签本身,但这看起来并不整齐.
那么,存储在主项目树中的子模块唯一的东西就是提交对象的哈希,所以即使有一个命令说"将我的子模块设置my-tag为该子模块中的标签",它最终也只是无论如何存储对应于该标签的哈希值......
git submodule update如果您的子模块是最新的,则不会获取任何内容。所以这可能是一个误解。
git submodule update将使存储库中子模块的工作目录内容达到定义的状态(即检查存储库中已定义的子模块提交)。
更好的方法是cd进入你的子模块(它本身就是一个 Git 存储库)并简单地运行git fetch --tags然后git checkout some-tag. 之后,子模块已在您的工作目录中更新为some-tag,您可以将其暂存以进行提交。
| 归档时间: |
|
| 查看次数: |
8672 次 |
| 最近记录: |