我已经克隆了很多存储库,所以我编写了一个脚本来检查预期的标记是否与我所拥有的相同。如果不是,它将git pull origin newtag。但是,有时期望的标记比远程中的最后一个标记更老,即使这两个标记之间没有任何更改(但是创建新标记是因为其他repos接收到了更改)。但是有了那个吉特拉力,我得到的是最新的标签,而不是预期的标签。因此,脚本将再次git pull origin newtag,即使我已经拥有它。要检查我所在的当前标记,我使用git describe --tags --exact-match
发布于 2017-09-28 21:10:34
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_r4和8.0.0_r12是带注释的标记,但实际上指向相同的提交,4fcacd3d193f1e1dfb0f5a9e818dd895eca45427。
标记8.0.0_r11还指向相同的提交(单击r11查看;将r11更改为r4或r8以查看所选网页显示格式中的每个带注释的标记)。
换句话说,您签出的这些标记中的哪一个并不重要:您为所有三个标记都获得了相同的源代码。如果您想要记住用于执行git checkout操作(示例中的git clone的最后一步)的标记,则必须将其保存在某个地方。相反,Git保存了这样一个事实:签出提交4fcacd3d193f1e1dfb0f5a9e818dd895eca45427,而git describe --tags查找一个导致4fcacd3d193f1e1dfb0f5a9e818dd895eca45427的标记。它发现了很多,并挑选了一个。在这里,如果它查看带注释的标记,就会使用带注释的标记日期。
无论何时运行git fetch (git pull的前半部分),Git都会获得新的对象;这可能包括新的标记。避免获取(任何类型的、轻量级的或带注释的)新标记的主要方法是避免获取。
如果选择新标记为时已晚,请注意,您可以通过使用git for-each-ref refs/tags并将每个标记解析到其目标对象(通常是提交),或者具体地解析到commit (如果标记指向其他对象类型(在可能遍历了前一个标记之后),查看所有标记(或所有带注释的标记)。
https://stackoverflow.com/questions/46477162
复制相似问题