error: cannot lock ref... 'refs/tags' exists; cannot create 'refs/tags/.

githubから変更を取り出そうとすると、奇妙な"cannot lock ref"エラーが発生します。 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)
質問へのコメント (1)
ソリューション

あなたのGitは、refs/tagsという名前の参照(ディレクトリではなく)が存在すると訴えています。 何がその参照を作ったのかは不明ですが、git rev-parse refs/tags がハッシュ ID を生成するかどうかを見てみましょう。 もしそうなら、その参照はなくす必要があります。

git update-ref -d refs/tags

その後、git fetch が動作するはずです。

もし git rev-parse refs/tags が失敗したら (そうなるべきです-refs/tags 自体が有効な名前であってはなりません)、これは *問題ではなく、実際の問題が何であるかは明確ではありません。

解説 (4)

走っている。

git remote prune origin

私のために働いた。 これがなぜ問題だったのかはわかりませんが、リモートブランチへの言及が壊れているようです。

解説 (0)

error: cannot lock ref 'refs/tags/v2.8': 'refs/tags' exists; cannot create '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
解説 (6)
#!/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。

解説 (0)

手っ取り早い方法として、次のような方法があります。

git push --delete origin 'v2.8'`

git push --delete origin 'v2.9'

解説 (0)

これは私が試したものであり、私のために働きました。

git remote prune origin
解説 (0)