2017-04-21 517 views
7

当我尝试从github提取更改时,出现一个奇怪的“无法锁定ref”错误。我试过git gc,并且四处寻找类似的错误,但是找不到解决方案。错误:无法锁定引用..'refs/tags'exists;无法创建'refs/tags/

> 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) 

回答

27

你的Git是抱怨一个名为refs/tags引用(而不是目录)存在。目前还不清楚会创建那个,但看看git rev-parse refs/tags是否会产生一个哈希ID。如果是这样,需要的参考走开:

git update-ref -d refs/tags 

之后git fetch应该工作。

如果git rev-parse refs/tags失败(这应─refs/tags本身不应该是一个有效的名称),那么这是不是问题,目前还不清楚实际的问题是什么。

+0

这样做!我不知道我是如何进入这个状态的。但现在一切都很好。谢谢。 – k3it

+0

git fetch有更多的错误我设法解决所有自动在我的答案在下面... –

1

error: cannot lock ref 'refs/tags/v2.8': 'refs/tags' exists; cannot create 'refs/tags/v2.8' From 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 
+0

没有工作。拉给出与上面相同的错误,对于git fetch -p也是如此。我无法推送本地更改,因为远程遥遥领先,拉不起作业 – k3it

+0

为我工作。谢谢! – Maor

+0

为所有标签手动执行它是一项繁琐的工作,我在下面的答案中自动生成了删除命令... –

0

对于一个快速的工作你周围可以使用

git push --delete origin 'v2.8'

git push --delete origin 'v2.9'

+0

git push也不起作用 –

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解决这些问题-exist-tags-delete.sh使用以下命令自动从XXX-errors.log中获得:

  1. git的更新裁判-d裁判/标签
  2. 混帐取
  3. 混帐拉
1

运行

git remote prune origin 

为我工作。不知道为什么这是问题,但似乎有一个对远程分支的引用失败。