Beim Versuch, Änderungen aus Github zu ziehen, wird ein merkwürdiger Fehler "Kann nicht sperren" angezeigt. Ich habe git gc ausprobiert und nach ähnlichen Fehlern gesucht, aber keine Lösung gefunden.
> 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)
Ihr Git beschwert sich darüber, dass eine Referenz (und nicht ein Verzeichnis) namens refs/tags
vorhanden ist. Es ist nicht klar, was erstellt das wäre, aber ob git rev-parse refs/tags
eine Hash-ID erzeugt. Wenn ja, muss diese Referenz weggehen:
git update-ref -d refs/tags
nach dem git fetch
funktionieren sollte.
Wenn git rev-parse refs/tags
fehlschlägt (was sollte - refs/tags
selbst sollte kein gültiger Name sein), ist dies nicht das Problem und es ist nicht klar, was das eigentliche Problem ist.
Laufen
git remote Prune Origin
Arbeitete für mich. Nicht sicher, warum dies das Problem war, aber anscheinend gab es einen defekten Verweis auf einen entfernten Zweig.
#!/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
Das obige Skript protokolliert Fehler in XXX-errors.log und behebt diese, indem es automatisch eine XXX -exist-tags-delete.sh-Datei aus der XXX-errors.log generiert und ausführt.
fehler: Ref 'Refs/Tags/v2.8' kann nicht gesperrt werden: 'Refs/Tags' ist vorhanden; "refs/tags/v2.8" kann nicht erstellt werden Von github.com: k3it/qsorder
Löschen Sie Ihr lokales Tag v2.8
und v2.9
und ziehen Sie es erneut.
$ git tag -d v2.8
$ git tag -d v2.9
$ git pull
Wenn Sie alle lokalen Tags mit einem Befehl löschen möchten:
$ git tag | xargs git tag -d
Für eine schnelle Umgehung können Sie verwenden
git Push --delete Origin 'v2.8'
git Push --delete Origin 'v2.9'