2017-04-21 35 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 

爲我工作。不知道爲什麼這是問題,但似乎有一個對遠程分支的引用失敗。

相關問題