错误:无法锁定ref ..' refs / tags'存在;无法创建' refs / tags /

时间:2017-04-21 03:30:24

标签: git github

我得到一个奇怪的"无法锁定参考"尝试从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)

10 个答案:

答案 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.8v2.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来修复它们:

  1. git update-ref -d refs / tags
  2. git fetch
  3. git pull

答案 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