git push: refs/heads/my/subbranch существует, не может создавать
Невозможно ли создать под-папку somme в репо на сервере?
если я сделаю:
git push origin dev/master
все работает найти
но если я это сделаю
git push origin dev/sub/master
Я получил это:
error: 'refs/heads/dev/sub' exists; cannot create 'refs/heads/dev/sub/master'
я проверил с помощью "git branch -r" и напрямую с ssh, не существует уже созданной папки dev/sub.
что не так?
Ответы
Ответ 1
Это не папка, которая существует, это ветка. (Ну, может быть папка/каталог, где-то где-то, или, может быть, нет, поскольку ссылки "упакованы" и перестают существовать как файлы в каталогах.)
- Если существует ветвь
b
, ни одна ветвь с именем b/anything
может быть создана. - Аналогично, если ветвь
dev/b
существует, dev/b/c
не может быть создан.
Это внутреннее ограничение git. В этом конкретном случае у удаленного origin
есть ветвь с именем dev/sub
(независимо от того, есть она у вас или нет, важно то, имеет ли ее пульт). Чтобы создать по origin
ветку с именем dev/sub/master
, вы должны сначала удалить ветвь с именем dev/sub
по origin
:
git push origin :dev/sub
(Конечно, удаление этой ветки может удалить что-то важное там, поэтому убедитесь, что вы знаете, что вы делаете. В общем, вы можете захотеть сначала git fetch origin
, захватив их dev/sub
как ваш origin/dev/sub
. затем создайте локальную ветвь с именем dev/renamed-sub
указывающую на ту же фиксацию, создайте dev/renamed-sub
на удаленном компьютере, удалите удаленный dev/sub
и затем создайте dev/sub/master
на пульте дистанционного управления.)
Если вы можете войти на пульте дистанционного управления (системы, origin
размещенного на), вы можете пойти в хранилище туда и просто переименовать локальный dev/sub
ветки. (Основываясь на комментариях ниже, я подозреваю, что там также есть сломанный скрипт автоматического развертывания, который, вероятно, должен быть исправлен только для развертывания "развертываемых" ветвей, а не для всего, что нажимается. Но я просто угадываю здесь.)
Ответ 2
Я был в состоянии, когда я не мог даже получить, потому что у моего репо была информация о несуществующих удаленных ветких, которые я даже не проверил. Я решил это, выполнив комбинацию (спасибо @torek):
-
git branch -r
перечисляет локальные копии удаленных веток -
git ls-remote
список удаленных веток -
git fetch --prune origin
обновляет локальные копии удаленных веток (это на самом деле мне не помогло) -
git remote prune origin
удаляет информацию об удаленных удаленных ветках (это было сделано)
Ответ 3
Ответ, полученный в настоящее время, не помог мне, потому что у меня не было ссылки на удаленное репо, чтобы удалить его - это было чисто на моем местном! Итак, если вы в этой ситуации, вот что делать:
Это проблема, с которой я столкнулся:
$ git fetch origin
error: cannot lock ref 'refs/remotes/origin/fix/sub-branch':
'refs/remotes/origin/fix' exists; cannot create
'refs/remotes/origin/fix/sub-branch'
From <repo URL>
! [new branch] fix/sub-branch -> origin/fix/sub-branch
(unable to update local ref)
Я попробовал принятое предложение ответа, но получил следующее:
$ git push origin :fix
error: unable to delete 'fix': remote ref does not exist
error: failed to push some refs to <repo URL>
Так что ref даже не существовал по origin
- он явно просто висел где-то на моем местном репо. Таким образом, я запустил $ git remote show me
, в котором были выпущены:
Remote branches:
...
refs/remotes/origin/fix stale (use 'git remote prune' to remove)
...
Который затем сделал решение понятным:
$ git remote prune origin
Pruning origin
URL: <redacted>
* [pruned] origin/fix
С этим проблема исчезла:
$ git fetch origin
remote: Counting objects: 5, done.
remote: Total 5 (delta 2), reused 2 (delta 2), pack-reused 3
Unpacking objects: 100% (5/5), done.
From <repo URL>
* [new branch] fix/sub-branch -> origin/fix/sub-branch
Ответ 4
Попробуйте эту команду, чтобы исправить это:
git gc
для выполнения ряда домашних задач в текущем репозитории и удаления недоступных объектов (путем вызова git prune
и git fsck --unreachable
).
Подробнее: git help gc
и git help prune
Ответ 5
#!/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
echo push
log="git-push-errors.log"
script="./git-push-exist-tags-delete.sh"
git_command="git push"
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 push
В приведенном выше скрипте будут записываться ошибки в XXX-errors.log и исправить их, создав и запустив XXX-существующие теги -d elete.sh автоматически из XXX-errors.log, используя следующие команды:
- git update-ref -d refs/tags
- git fetch
- git pull
- git push
Ответ 6
git remote prune origin
исправил проблему для меня