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, используя следующие команды:

  1. git update-ref -d refs/tags
  2. git fetch
  3. git pull
  4. git push

Ответ 6

git remote prune origin исправил проблему для меня