我得到一个奇怪的"无法锁定参考"尝试从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)
答案 0 :(得分:52)
您的Git抱怨名为refs/tags
的引用(而不是目录)存在。它不清楚创建会是什么,但看看git rev-parse refs/tags
是否产生了哈希ID。如果是这样,该引用需要消失:
git update-ref -d refs/tags
之后git fetch
应该有效。
如果git rev-parse refs/tags
失败(它应该 - refs/tags
本身不应该是有效名称)那么这不问题并且不清楚是什么实际问题是。
答案 1 :(得分:27)
正在运行
git remote prune origin
为我工作。不知道为什么会出现这个问题,但似乎有一个对远程分支的破坏引用。
答案 2 :(得分:1)
错误:无法锁定ref'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
答案 3 :(得分: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来修复它们:
答案 4 :(得分:1)
就我而言,以下内容有所帮助:
git fetch --prune origin
git pull
答案 5 :(得分:0)
如需快速解决,可以使用
git push --delete origin 'v2.8'
git push --delete origin 'v2.9'
答案 6 :(得分:0)
我试图推送(/ dev / somechanges),但我有一个具有相同前缀的远程分支(/ dev) 当我选择一个不以/ dev开头的新名称时,效果很好。
答案 7 :(得分:0)
第一个解决方案 ==>:假设您有一个名为 develop 的分支,并且您正在尝试创建名为 develop/updatefeature 的新分支这将导致此错误,这就是我的情况,因此如果您从新分支中删除开发字 (updatefeature),我认为应该可以解决该问题。
第二种解决方案 ==>:在 bash 中使用以下命令
SUM=$(awk '{sum+=$5} END{print sum}' file.txt)
答案 8 :(得分:0)
git gc
会解决它!
清理不必要的文件并优化本地存储库
Link
答案 9 :(得分:-1)
这是我尝试过的方法,对我有用。
git remote prune origin