当我尝试从 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 抱怨存在名为
refs/tags
的引用(而不是目录)。 目前还不清楚什么会创建,但看看git rev-parse refs/tags
是否会产生哈希ID。 如果是这样,该参考需要消失:
git update-ref -d refs/tags
之后
git fetch
应该可以工作。
如果
git rev-parse refs/tags
失败(它应该 — refs/tags
本身不应该是有效名称),那么这不是 问题,并且不清楚实际问题是什么。
git remote prune origin
为我工作。不知道为什么这是问题所在,但似乎对远程分支的引用已损坏。
git fetch --prune origin
git pull
第一个解决方案==>:假设您有一个名为develop的分支,并且您正在尝试创建名为develop/updatefeature的新分支,这将导致此错误,这就是我的情况,所以如果您删除develop一词来自新分支(updatefeature)我认为应该解决这个问题。
第二种解决方案 ==>:在bash中使用以下命令
git remote prune origin
错误:无法锁定引用“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
git update-ref --no-deref -d refs/remotes/origin/branch_name
#!/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 push --delete origin 'v2.8'
git push --delete origin 'v2.9'
git remote prune origin
git update-ref -d refs/tags
和
git remote prune origin
,但没有任何效果。我的命令是
git checkout -b test/revert_code
,所以最后我认识到问题不是git,而是我的命令本身。当我删除“
test/
”时,它正常工作。所以我的最终命令是
git checkout -b revert_code
。也许这只是一个罕见的情况,但希望这可以帮助那些尝试过上述所有解决方案但没有成功的人。
C:\git\repo\.git\logs\refs\remotes\origin\secops
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
git checkout myTeam/branchA
git rev-parse refs/myTeam/branchA
git remote prune origin
git checkout myTeam/branchA