如何摆脱“会破坏现有标签”

Ske*_*eve 248 git

我在 VSCodium 中使用 git,每次我尝试拉 git 时都在抱怨。

查看我看到的日志

> git pull --tags origin master
From https://github.com/MY/REPO
 * branch            master     -> FETCH_HEAD
 ! [rejected]        latest     -> latest  (would clobber existing tag)
   9428765..935da94  master     -> origin/master
Run Code Online (Sandbox Code Playgroud)

执行命令 --force在下一次之前使用。

我不清楚这里出了什么问题。发生了什么,我该如何解决这个问题?

我的意思是:除了破坏我的本地仓库并再次克隆。

Tua*_*ran 596

您应该使用远程标签更新本地标签:

git fetch --tags -f
Run Code Online (Sandbox Code Playgroud)

然后再拉。

  • 这对我有用。我在使用 VSCode 时遇到问题,然后在命令行中运行它解决了该问题。:) (28认同)
  • @Sagivb.g 在远程,有人删除一个标签并创建一个具有相同名称的新标签,然后这将发生在您的本地 (15认同)
  • 如果您使用 fork,请务必使用`git fetch --all --tags --force`。 (5认同)
  • 谢谢,您能解释一下吗?这是一次性命令吗?到底是什么问题以及如何解决它。 (4认同)

Vla*_*274 62

由于您说不清楚出了什么问题,我假设您没有将该标签用于任何事情,而您只想做自己的工作。

关闭此设置:

在此处输入图片说明

现在你已经准备好了。


详细解释:

标签只是对特定提交的引用(就像分支名称一样)。主要区别在于git(据我所知)假设标签不会改变,分支预计会被更新。

因此,“错误”是您在本地有一个名为latest指向提交 X 的标签 - 但远程有一个名为latest指向提交 Y 的标记。如果您从远程应用更改,您将覆盖本地标记。

默认情况下,VSCode 会拉取所有标签,因此您会收到错误消息。

有一个“移动”标签没有任何问题,比如latest,这不是 VSCode 考虑到的(个人意见)。


或者,您可以通过使用命令行并手动输入git pull命令来避免该问题。具体来说,您需要省略--tags以跳过该过程的步骤。

如果您这样做,您的标签将不会更新 - 但我认为这不是问题。

  • 我认为这个答案更好,因为它将永久解决问题,而不仅仅是一次性修复。如果您的团队定期重新标记,则特别有用。 (3认同)

zhu*_*iyi 46

原因可能是您或其他贡献者删除了原始标签并重新创建了相同的标签。

解决方案:

git fetch --tags -f
Run Code Online (Sandbox Code Playgroud)

强制刷新本地标签


当使用按钮更新编辑器中的代码时,默认会首先使用git pull --tags origin master

因此,可以"git.pullTags": false在Vscode的配置文件settings.json中添加此内容


eck*_*ckc 15

编辑:需要明确的是,最初的问题与一个问题有关git。虽然可能不明显,但yarn也可能有 git 依赖项。因此,对于运行时出现此错误的 0.1% 用户来说yarn install,这是为您准备的!如果没有,只需使用已接受/最佳答案。


我在尝试运行包时遇到此错误yarn install。接受的答案适用于当前的存储库,对我不起作用,但这是有效的:

rm -rf **/node_modules && yarn cache clean
Run Code Online (Sandbox Code Playgroud)

我之前尝试过删除node_modules,猜测是清理纱线缓存造成的。

  • 什么是yarn,它与git有关吗? (4认同)
  • 我希望这没有被低估那么多。我知道原来的问题是严格针对 git 的,但是谷歌搜索我的纱线错误给了我这个问题作为最佳结果,而这个答案正是我所需要的。 (4认同)
  • `yarn` 是一个包管理器,通常用作 `npm` 的替代品。您可以添加 git 依赖项以从 git 存储库进行安装,而不是使用包。我假设重置纱线缓存允许它正确更新 git 标签,类似于接受的答案建议如何获取标签。 (2认同)
  • 这正是我所需要的,但我最初没有看到它,因为它被否决了太多。谢谢@eckc! (2认同)
  • 这是一个很好的答案并且对我有用,但是危险的是“**/”。正确的做法是仅从出现错误的存储库中删除节点模块。即:`rm -rf ./node_modules && 纱线缓存清理` (2认同)

cmb*_*ley 6

如果这是删除并重新创建标签的常见情况(例如,GitHub Actions 的建议是使用浮动主要版本标签,“最新”可能是用actions-tagger标记的内容),您可以编辑您的标签.git/config以添加以下参考规范:

[remote "origin"]                                                                                                                                              
  url = https://github.com/org/repo                                                                                                                 
  fetch = +refs/heads/*:refs/remotes/origin/*                                                                                                                

  # extra refspec
  fetch = +refs/tags/*:refs/tags/*
Run Code Online (Sandbox Code Playgroud)

由于标签不是按远程命名的,因此您应该了解这可能产生的影响,但它对于某些用例可能有意义。

要解释为什么这是必要的,请参阅git-fetch 文档(重点是我的):

在 Git 版本 2.20 之前,与使用 git-push 推送不同,任何更新都将在不包含 refspec(或)的情况下refs/tags/*被接受。在获取时,我们混杂地认为来自远程的所有标签更新都是强制获取。从 Git 版本 2.20 开始,获取更新的工作方式与推送时相同。即,如果没有refspec(或) ,任何更新都将被拒绝+--forcerefs/tags/*+--force

  • https://imgur.com/a/7G23I7Z (2认同)