[英]git: reset submodule branch to remote tag
我有一个带标签的主模块,我在主模块下有一些子模块。 我想将主模块重置为特定标签(例如“v2.11.0”)并将子模块也重置为该标签。 该标签仅在主模块中,因此它是子模块的远程标签。
git fetch --all --tags
git reset --hard tags/v2.11.0
git submodule foreach --recursive git checkout -B master
git submodule foreach --recursive git reset --hard tags/v2.11.0
将主模块重置为标签有效。 但是将子模块重置为远程标记不适用于上面的代码。 你知道怎么回事吗?
格雷茨
标签是提交的名称。 因此,超级项目中的tags/v2.11.0
标签是超级项目中特定提交的名称,即表示编号或哈希 ID。 所以这:
git fetch --all --tags git reset --hard tags/v2.11.0
有点奇怪, 1但并不完全疯狂。
但是,每个子模块都是一个单独的 Git 存储库。 那个单独的 Git 存储库可能有也可能没有标签v2.11.0
; 如果确实有这样一个标签,该标签将代表其他一些承诺在其他的Git仓库存在:
标签仅在主模块中......
我认为这意味着每个子模块都没有这样的标签。
... 所以它是子模块的远程标签
不,这不对。 没有“远程标签”这样的东西。 标签只是提交哈希 ID 的名称,在任何给定的存储库中,您要么拥有该标签,要么没有。 如果你没有标签,你就没有那个名字。 一些其他存储库的标签是该存储库中某个哈希 ID 的名称。
Git 是关于提交的。 每个提交都有一个唯一的哈希 ID。 这就是您使用 Git 所做的很多事情:您可以使用像master
或develop
类的分支名称,或者像v2.11.0
这样的标签名称,但您实际上是在告诉 Git让我提交b0ff0cab1e...
。 (完整的哈希 ID 又长又丑,但您可以通过以下方式找到它:
git rev-parse tags/v2.11.0
例如。)
使用超级项目的正常方法是在超级项目提交中为每个子模块提供正确的哈希 ID。 这是提交本身的一部分,作为 Git 称为gitlink的实体。 检查超级项目提交结果会将该 gitlink 放入超级项目 Git 的索引中。 Git 的索引现在保存,作为路径名和哈希 ID 对,如path/to/submodule
和feedc0ffee...
,人们可能希望子模块进行git checkout
(作为分离的 HEAD)的提交。
如果你想让每个子模块在那个提交时成为一个分离的 HEAD,你现在应该运行:
git submodule update checkout
或者:
git submodule update --recursive checkout
使子模块本身递归地检出它自己的任何子模块。
1 git fetch
的--all
选项意味着从所有遥控器中获取。 这在您使用它的上下文中有点意义,因为每个遥控器都可能有一些标签集,这将使您的 Git 将所有标签复制到一个巨大的标签联合中。 如果存在冲突——如果远程 A 说标签v1.2.3
应该意味着deadbeef
而远程 B 说标签v1.2.3
应该意味着feedf00d
, feedf00d
,无论你先选择哪个“赢”。
git reset --hard
可能是错误的做法。 如果你已经在一个分离的HEAD
,这就像对给定的标签进行git checkout
,副作用是丢弃任何尚未提交的工作。 如果您在分支名称上,这会更改该分支名称中存储的哈希 ID,这可能是错误的。
总的来说,运行git fetch --tags
而没有--all
来从当前远程获取,或者选择一个特定的远程来信任可能更明智; 或者如果只有一个遥控器, git fetch --tags
将使用那个遥控器,然后--all
是不必要的。 然后,完成后,使用git checkout tags/v2.11.0
或git switch --detach tags/v2.11.0
,如果有未提交的工作,它会抱怨。
git submodule update --init --recursive
git submodule foreach git checkout -f -B master
这会将子模块设置为属于超级项目标签的提交。 之后,将在此提交上检出 master 分支。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.