git - 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
谢谢!
解决方案
当您执行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
推荐阅读
- javascript - 错误-:8080/:1 GET http://localhost:8080/404 (OK)
- javascript - 使用 lodash 仅获取非空白的对象键值
- python - 如何基于 RIDE python 机器人框架将日期格式从 dd/mm/yyyy 转换为 yyyy-mm-dd
- google-cloud-platform - JMeter 测试结果 - 连接时间是请求 (HTTP) 采样时间的 100%
- python - 如何使用opencv python提取表格行上方的文本内容?
- javascript - 带有选择选项的 vuejs2 获取值和其他属性
- elasticsearch - ElasticSearch - 在 query_string 中使用“现在”范围返回 0 个命中
- haskell - 如何为 Church 编码的免费 monad 编写展开器?(Haskell)
- node.js - github操作工作流程:生命周期中的不安全烫发真
- java - 在 Spring Boot MongoDB 中查找重复条目?