首页 > 解决方案 > Git 标记指向错误的提交 ID

问题描述

所以目前我有一个简单的 Jenkins 工作,它获取来源、创建标签并推送标签。此 Jenkins 作业每周运行一次,运行日期是标签名称的一部分。如果需要核心更改,我每周都会做这些标签来制作 git 补丁并将不同的基线合并在一起(所有这些东西都发生在单独的 Jenkins 工作中,我怀疑是否相关)。这在大约 10 个回购中完成,但我的问题只发生在一个回购中。

在有问题的 repo 中,这项工作现在已经运行了大约 3 年,并且有大约 160 个这些标签的标签(repo 中总共大约 380 个标签)。最近,大约每 3-4 个月一次(2020 年 9 月至 12 月 4 次),标签出现问题,它们指向 3.75 年前的提交(每个搞砸的标签都指向相同的提交 ID)。此 repo *应该* 与其他 9 个没有此问题的 repo 相同。

我无法复制它,因为它不经常发生,但任何关于为什么会发生这种情况或防止它再次发生的方法的想法请告诉我!

来自 Jenkins 作业的 Shell 代码(git 在每个 repo 的循环中调用重复):

TODAY=$(date +'%Y%m%d)

git fetch origin && git tag DIFFS_$TODAY && git push origin DIFFS_$TODAY

谢谢!

标签: gitjenkinsgitlab

解决方案


当您执行git fetch时,远程上的新提交将添加到您的本地存储库中,但HEAD不会推进到最新提交,它仍然指向存储库在最后一次拉/重置/提交发生时正在查看的提交.

当你执行git pull时,最新的提交被fetch编辑,然后 git 将尝试推进到最新版本。根据您本地 repo & config 的状态,它可能会执行以下操作之一:

  • 快进
  • 合并
  • 变基

这些都可能失败,因此pull是一个有点危险的选择。一个更安全的选择是,如果你知道你想要对原点进行确切的更改,那就是fetch, then reset --hard。这不会尝试进行任何合并并强制快进。

如果你想要的只是设置一个标签,你甚至不需要本地工作目录来反映远程更改。获取后,您可以指定要tag origin/main

 git fetch origin/main
 git tag DIFFS_$TODAY origin/main
 git push --tags DIFFS_$TODAY

但是还有一种更简单的方法(或者至少更快),您可以推送标签而无需在本地创建它,但您仍然必须获取更改:

 git push origin origin/main:refs/tags/DIFFS_$TODAY

推荐阅读