Error: невозможно заблокировать ref.. 'refs/tags' существует; не может создавать 'refs/tags/
Я получаю странную ошибку "не могу заблокировать ref" при попытке вытащить изменения из 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)
Ответы
Ответ 1
Ваш Git жалуется, что существует ссылка (а не каталог) с именем refs/tags
. Не понятно, что бы создать это, но посмотрите, если git rev-parse refs/tags
создает хэш-идентификатор. Если это так, эта ссылка должна исчезнуть:
git update-ref -d refs/tags
после которого git fetch
должен работать.
Если git rev-parse refs/tags
терпит неудачу (что должно быть - refs/tags
не должно быть корректным именем), то это не проблема, и неясно, какова фактическая проблема.
Ответ 2
Выполнение
git remote prune origin
Работал для меня. Не уверен, почему это было проблемой, но похоже, что была некорректная ссылка на удаленную ветвь.
Ответ 3
error: невозможно заблокировать 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
Ответ 4
#!/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
script выше будет регистрировать ошибки в XXX-errors.log и исправить их, создав и запустив XXX-exist-tags-delete.sh автоматически из XXX-errors.log, используя следующие команды:
- git update-ref -d refs/tags
- git fetch
- git pull
Ответ 5
Для быстрой работы вы можете использовать
git push --delete origin 'v2.8'
git push --delete origin 'v2.9'
Ответ 6
Эта тема может быть также полезна
git push: ссылки/заголовки/мои/дочерние ветки существуют, не могут создать
Если у вас есть существующая ветка "а", и вы пытаетесь создать что-то вроде "а/что-то еще"