错误:无法锁定引用..“引用/标签”存在;无法创建“参考/标签/

问题描述 投票:0回答:15

当我尝试从 github 中提取更改时,出现奇怪的“无法锁定引用”错误。 我尝试过 git gc,并四处寻找类似的错误,但找不到解决方案。

> git pull
error: cannot lock ref 'refs/tags/v2.8': 'refs/tags' exists; cannot create 'refs/tags/v2.8'
From github.com:k3it/qsorder
 ! [new tag]         v2.8       -> v2.8  (unable to update local ref)
error: cannot lock ref 'refs/tags/v2.9': 'refs/tags' exists; cannot create 'refs/tags/v2.9'
 ! [new tag]         v2.9       -> v2.9  (unable to update local ref)
git github
15个回答
174
投票

您的 Git 抱怨存在名为

refs/tags
的引用(而不是目录)。 目前还不清楚什么会创建,但看看
git rev-parse refs/tags
是否会产生哈希ID。 如果是这样,该参考需要消失:

git update-ref -d refs/tags

之后

git fetch
应该可以工作。

如果

git rev-parse refs/tags
失败(它应该 —
refs/tags
本身不应该是有效名称),那么这不是 问题,并且不清楚实际问题是什么。


142
投票
跑步

git remote prune origin

为我工作。不知道为什么这是问题所在,但似乎对远程分支的引用已损坏。


18
投票

git gc

就解决了!

清理不需要的文件,优化本地仓库

链接


13
投票
就我而言,以下内容有帮助:

git fetch --prune origin git pull
    

9
投票

第一个解决方案==>:假设您有一个名为develop的分支,并且您正在尝试创建名为develop/updatefeature的新分支,这将导致此错误,这就是我的情况,所以如果您删除develop一词来自新分支(updatefeature)我认为应该解决这个问题。

第二种解决方案 ==>:在bash中使用以下命令

git remote prune origin
    

8
投票
错误:无法锁定引用“refs/tags/v2.8”:“refs/tags”存在;无法创建“refs/tags/v2.8” 来自 github.com:k3it/qsorder

尝试删除本地标签

v2.8

v2.9
,然后再次拉取。

$ git tag -d v2.8 $ git tag -d v2.9 $ git pull


如果想通过命令删除所有本地标签:

$ git tag | xargs git tag -d
    

6
投票
在所有其他答案都无效之后,这对我有用

git update-ref --no-deref -d refs/remotes/origin/branch_name


    


1
投票
#!/usr/bin/env bash echo "update-ref delete refs/tags" log="git-update-ref-errors.log" script="./git-update-ref-exist-tags-delete.sh" git_command="git update-ref -d refs/tags" echo "log errors from ${git_command} to ${log}" ${git_command} 2>&1 | > ${log} echo "show errors to ${log}" cat ${log} echo create ${script} touch ${script} echo "add execute (+x) permissions to ${script}" chmod +x ${script} echo "generate ${script} from errors log ${log}" ${git_command} 2>&1 | grep 'exists' | sed -n "s:.*\: 'refs/tags/\(.*\)' exists;.*:git tag -d '\1':p" >> ${script} echo "execute ${script}" ${script} echo fetch log="git-fetch-errors.log" script="./git-fetch-exist-tags-delete.sh" git_command="git fetch" echo "log errors from ${git_command} to ${log}" ${git_command} 2>&1 | > ${log} echo "show errors from ${log}" cat ${log} echo create ${script} touch ${script} echo "add execute (+x) permissions to ${script}" chmod +x ${script} echo "generate ${script} from errors log ${log}" ${git_command} 2>&1 | grep 'exists' | sed -n "s:.*\: 'refs/tags/\(.*\)' exists;.*:git tag -d '\1':p" >> ${script} echo "execute ${script}" ${script} git fetch echo pull log="git-pull-errors.log" script="./git-pull-exist-tags-delete.sh" git_command="git pull" echo "log errors from ${git_command} to ${log}" ${git_command} 2>&1 | > ${log} echo "show errors from ${log}" cat ${log} echo create ${script} touch ${script} echo "add execute (+x) permissions to ${script}" chmod +x ${script} echo "generate ${script} from errors log ${log}" ${git_command} 2>&1 | grep 'exists' | sed -n "s:.*\: 'refs/tags/\(.*\)' exists;.*:git tag -d '\1':p" >> ${script} echo "execute ${script}" ${script} git pull

上面的脚本将错误记录到 XXX-errors.log 并通过使用以下命令从 XXX-errors.log 自动生成和运行 XXX-exist-tags-delete.sh 来修复它们:

    git update-ref -d 参考/标签
  1. git 获取
  2. git拉

0
投票
为了快速解决问题,您可以使用

git push --delete origin 'v2.8'



git push --delete origin 'v2.9'


    


0
投票
这是我尝试过的,它对我有用。

git remote prune origin
    

0
投票
我试图推送(/dev/somechanges),并且我有一个具有相同前缀的远程分支(/dev) 当我选择一个不以 /dev 开头的新名称时,它工作得很好。


0
投票
对我来说,我尝试了

git update-ref -d refs/tags

git remote prune origin
,但没有任何效果。

我的命令是

git checkout -b test/revert_code

,所以最后我认识到问题不是git,而是我的命令本身。当我删除“
test/
”时,它正常工作。所以我的最终命令是
git checkout -b revert_code

也许这只是一个罕见的情况,但希望这可以帮助那些尝试过上述所有解决方案但没有成功的人。


0
投票
尝试删除文件夹中的特定文件

C:\git\repo\.git\logs\refs\remotes\origin\secops
    

0
投票
对于那些使用 Jenkins Pipeline 的人:

  • Pipeline script from SCM
    ,
  • 转到
  • Additional Behaviors
  • 添加
  • Prune stale remote-tracking branches
    步骤,这将
为每个远程运行“git remote prune”,以修剪过时的本地分支。

这样,作业将在尝试签出要从中构建的分支之前修复 git 存储库中的错误。

感谢 git 开发人员,因为错误消息给出了确切的解决方案!

包含相关错误的示例日志:

ERROR: Error fetching remote repo 'origin' hudson.plugins.git.GitException: Failed to fetch from MY_GIT_REPO_ADDRESS at hudson.plugins.git.GitSCM.fetchFrom(GitSCM.java:999) at hudson.plugins.git.GitSCM.retrieveChanges(GitSCM.java:1241) at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1305) ... Caused by: hudson.plugins.git.GitException: Command "git.exe fetch --tags --force --progress -- MY_GIT_REPO_ADDRESS +refs/heads/*:refs/remotes/origin/*" returned status code 1: stdout: stderr: error: cannot lock ref 'refs/remotes/origin/MY_NEW_BRANCH': 'refs/remotes/origin/MY_OLD_BRANCH' exists; cannot create 'refs/remotes/origin/MY_NEW_BRANCH' From MY_GIT_REPO_ADDRESS ! [new branch] MY_NEW_BRANCH -> origin/MY_NEW_BRANCH (unable to update local ref) error: some local refs could not be updated; try running 'git remote prune MY_GIT_REPO_ADDRESS to remove any old, conflicting branches
    

0
投票
我运行时遇到此错误

git checkout myTeam/branchA


解决方案:

  1. git rev-parse refs/myTeam/branchA
    
    
  2. git remote prune origin
    
    
  3. git checkout myTeam/branchA
    
    
© www.soinside.com 2019 - 2024. All rights reserved.