git delete remotes: удаленные ссылки не существуют

107

Коротко;

  • Как я могу удалить несколько удаленных объединенных пультов?

Больше фона;

У меня есть репозиторий git с десятками пультов, которые были объединены в мастер. Я могу удалить эти пульты по одному, используя:

git push --delete origin myBranch-1234

Однако для всех пультов это медленный и утомительный процесс. Итак, я пробую эту команду:

git branch -r --merged | grep origin | grep -v master | xargs git push origin --delete

git branch -r --mergedперечисляет все объединенные пульты.
grep originсообщает команде, что нужно включить origin.
grep -v masterсообщает команде исключить master.
xargs git push origin --deleteуказывает команде удалить список пультов.

Все вместе, я ожидаю, что это соберет все объединенные пульты и удалит их.

Когда я запускаю указанную выше команду, я получаю следующее для каждого объединенного пульта ДУ:

error: unable to delete 'origin/myBranch-1234': remote ref does not exist
error: unable to delete 'origin/myBranch-1235': remote ref does not exist
error: unable to delete 'origin/myBranch-1236': remote ref does not exist
error: unable to delete 'origin/myBranch-1237': remote ref does not exist
... etc

Однако эти пульты существуют, и я могу проверить каждый из них. Многие сайты и люди рекомендуют мне бегать, git fetch --pruneчтобы очистить недостающие ссылки. Это ничего не делает, потому что все эти пульты существуют.

Итак, я прошу вас, дорогая биржа стека;

  • Почему я могу удалить один пульт, а не много?
  • Моя команда верна?

Думаю, мне не хватает чего-то маленького. Каждый раз, когда я исследую это, кажется, что я делаю это правильно, но получаю указанные выше ошибки.

Jqw
источник

Ответы:

226

Возможно, вам сначала потребуется очистить локальный «кеш» удаленных веток. Попробуйте запустить:

git fetch -p origin

перед удалением.

Игорь
источник
2
Это решило проблему для меня, спасибо! Однако почему он не обновляется, когда я получаю без него --prune? На мой взгляд, это довольно вводит в заблуждение
dave0688
6
Просто примечание для людей, прибывающих сюда из поиска - хотя это явно полезно для большинства, кто приземляется здесь, на самом деле это не правильно с точки зрения исходной проблемы - проблема OP заключалась в том, что его команда неправильно включалась origin/в имена веток, как описано / решено в других ответах.
CupawnTae
104

Эти ветки удалены из удаленного (источника)? Если да, вы можете просто сделать

git fetch --prune origin

В противном случае они могут вернуться даже после того, как вы удалите их локально.

Обновление: еще раз взглянув на свою команду, похоже, что вы ее неправильно создаете. Ты наверное хочешь

git push origin --delete myBranch-1234

но вместо этого вы делаете что-то вроде

git push origin --delete origin/myBranch-1234
Николай Гуров
источник
Ни одна из ветвей изначально не удалена. Я могу проверить любой из них.
Jqw
1
да, потому что во втором случае вы выполняете разные команды.
Николай Гуров
1
Я не понимаю твою точку зрения. Я знаю, что использую две разные команды. Во втором случае я получаю все объединенные пульты, git branch -r --mergedа затем пытаюсь удалить их xargs git push origin --delete. Команда пытается удалить пульты, но считает, что remote ref does not exist.
Jqw
1
во второй команде, передаваемой по конвейеру, поместите echo рядом с, xargsчтобы увидеть, что на самом деле выполняется.
Николай Гуров
2
@Jqw Вы не можете включать origin/префикс в имя ветки, git уже знает, что вы работаете с исходными ветвями, так как вы работаете git push origin. Мыкола предложил сделать последнюю часть команды xargs echo, а не echo xargs [...].
Мэтью Рид
15

Используется sedдля удаления части 'origin /' и изменения легкой xargsчасти.

git branch -r --merged | grep origin | grep -v -e master | sed s/origin\\/// |  xargs -I{} git push origin --delete {}
Кост
источник