不要在存储库

时间:2017-09-28 19:47:15

标签: git git-pull

我有很多克隆的存储库,所以我制作了一个脚本来检查预期的标签是否与我的标签相同。如果没有,它将git pull origin newtag。但有时期望的标签比远程中的最后一个标签旧,即使两个标签之间没有任何变化(但是新标签是因为其他repos接收到的变化而创建的)。但是随着那个git pull,我得到了最新的标签,而不是预期的标签。所以脚本会再次git pull origin newtag,即使我已经拥有它。要检查我当前的标签,请使用git describe --tags --exact-match

1 个答案:

答案 0 :(得分:2)

TL; DR:只是不再获取

如果您避免抓取,则应避免为现有提交选择新名称。如果这不合适,您只需要在某处保存标记名称。如果找到新标记,则可以使用git rev-parse

检测到它指向同一个提交
git rev-parse android-8.0.0_r4^{commit}
git rev-parse android-8.0.0_r12^{commit}

会在这里生成相同的哈希值。

详细说明

标签不一定有年龄 - Git"带注释的标签"确实有一个时间戳,但轻量级标签只是为现有提交添加一个新名称,并且没有自己的时间戳 - 即使它们这样做,在处理分支时,单个线性度量很少就足够了。

  

git clone -b android-8.0.0_r4 https://android.googlesource.com/platform/build/blueprint

在您的特定示例中,如果我们查看https://android.googlesource.com/platform/build/blueprint,我们会发现标记8.0.0_r48.0.0_r12是带注释的标记,但字面上指向相同的提交,{{1} }。

标记4fcacd3d193f1e1dfb0f5a9e818dd895eca45427也指向同一个提交(点击https://android.googlesource.com/platform/build/blueprint/+/android-8.0.0_r11查看;将8.0.0_r11更改为r11r4以查看每个带注释的标记以他们选择的网页显示格式。)

换句话说,您检查这些标签中的哪一个并不重要:您获得所有这三个标签的相同源代码。如果您想记住用于执行r8操作的标记 - 示例中git checkout的最后一步 - 您必须自己保存它。相反,Git保存了这个签出提交git clone4fcacd3d193f1e1dfb0f5a9e818dd895eca45427查找导致git describe --tags的标记的事实。它找到很多,并选择一个。在这里,如果它正在查看带注释的标签,它会使用带注释的标签日期。

每当你运行4fcacd3d193f1e1dfb0f5a9e818dd895eca45427git fetch的前半部分)时,Git都会获得新对象;可能包括新标签。避免拾取新标签(任何类型,轻量级或注释)的主要方法是避免提取。

如果要避免拿起新标记为时已晚,请注意您可以使用git pull查看所有标记(或所有带注释的标记)并进行解析每个标记到它的目标对象(通常是一个提交),或者特别是一个提交(如果标记指向某个其他对象类型,则可能会失败,之后可能跟随它通过之前的标记)。