Gitlab-CI 中存在已删除的标签

Posted

技术标签:

【中文标题】Gitlab-CI 中存在已删除的标签【英文标题】:Deleted tags are present in Gitlab-CI 【发布时间】:2021-05-08 20:05:32 【问题描述】:

我正在使用语义发布进行版本控制。每当我将某些东西推送到我的分支时,CI (Gitlab) 都会执行语义发布。我的问题是我推送到我的 git 分支,semantic-release 创建了一个版本并创建了标签(例如 1.0.0)。最后,我发现我错过了对这次提交很重要的一些事情。所以我删除了 Gitlab 中的标签(Repository > Tags,例如https://gitlab.com/user/project/-/tags),最后再次推送我的提交。但是现在,semantic-release 告诉我标签已经存在,但 Gitlab 不再显示任何标签(我删除了所有标签)。 现在我决定将以下行添加到我的 CI:

git show-ref --tags -d

这显示了我已经在 Gitlab 中删除的所有标签,但它们似乎存在于我的 CI 中。所以我很困惑这里发生了什么......有什么想法吗?我的 CI 中是否需要“同步标签”之类的东西?

【问题讨论】:

【参考方案1】:

Git 是一个分布式源代码控制存储库,这意味着任何配置为跟踪远程存储库(可以是 Gitlab、Github、另一台个人计算机等)的本地存储库。每个存储库独立运行,但可以在它们之间推送或拉取更改。

例如,当您在本地更改文件并提交它们时,它们只存在于您的存储库中,直到您将它们推送到远程(通常是 Github、Gitlab 等)。然后,这些更改将在您本地和 Gitlab 上进行。如果其他人随后从 Gitlab 远程执行 git pull,则更改也将在他们的本地环境中。

同样,在 Gitlab 中删除标签只会将它们从该存储库中删除,而不会从其他任何地方删除。如果一个标签已经在遥控器上被删除,而你最好在本地删除它,最直接的方法是git tag --delete|-d tag1 tag2 ...,但你必须知道标签是什么。

如果您正在运行 git 2.17 或更高版本,您可以将标志传递给git fetch,它将像使用分支一样修剪标签: git fetch --prune --prune-tags--prune 选项删除远程中不存在的任何本地分支,--prune-tags 对标签执行相同操作。

以下是一些相关的有用 SO 问题:

Remove local git tags that are no longer on the remote repository

In git, how do I sync my tags against a remote server?

【讨论】:

【参考方案2】:

为了解决这个问题,我使用这个变通方法从原始所有标签同步:

- git tag --delete $(git tag) # delete all local tags  
- git fetch --all

【讨论】:

以上是关于Gitlab-CI 中存在已删除的标签的主要内容,如果未能解决你的问题,请参考以下文章

GitLab-CI 在管道中获取 pom 版本

Gitlab-ci:如果 MR 存在则触发 merge_request 分离管道,如果不存在则触发源分支管道。这两条管道不应同时运行

基于gitlab-ci实现maven及docker缓存的配置

gitlab-ci实际中需要注意几点

多个分支中的.gitlab-ci.yml的多个版本

如何让 gitlab-runner 从指定文件中读取而不是 .gitlab-ci.yml?