Je reçois une étrange erreur "ne peut pas verrouiller la référence" en essayant d'extraire les modifications de github J'ai essayé git gc, et j'ai cherché des erreurs similaires mais je ne trouve pas de solution.
> 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)
Votre Git se plaint de l'existence d'une référence (plutôt que d'un répertoire) nommée refs/tags
. On ne sait pas ce que créerait cela, mais on verra si git rev-parse refs/tags
produit un ID de hachage. Si oui, cette référence doit disparaître:
git update-ref -d refs/tags
après quoi git fetch
devrait fonctionner.
Si git rev-parse refs/tags
échoue (ce qui devrait être —refs/tags
lui-même ne devrait pas être un nom valide), alors c'est pas le problème et le problème n'est pas clair.
Fonctionnement
git remote Prune Origin
Travaillé pour moi Pas sûr de savoir pourquoi c'était le problème, mais il semble qu'il y ait eu une référence brisée à une branche distante.
#!/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
Le script ci-dessus enregistre les erreurs dans XXX-errors.log et les corrige en générant et en exécutant automatiquement XXX-exist-tags-delete.sh à partir de XXX-errors.log à l'aide des commandes suivantes:
erreur: impossible de verrouiller ref 'refs/tags/v2.8': 'refs/tags' existe ne peut pas créer 'refs/tags/v2.8' De github.com:k3it/qsorder
Essayez de supprimer vos balises locales v2.8
et v2.9
, puis tirez à nouveau.
$ git tag -d v2.8
$ git tag -d v2.9
$ git pull
Si vous souhaitez supprimer toutes les balises locales à l'aide d'une commande:
$ git tag | xargs git tag -d
Pour un travail rapide, vous pouvez utiliser
git Push --delete Origin 'v2.8'
git Push --delete Origin 'v2.9'