git delete Remotes: віддалених refs не існує


107

Коротко;

  • Як я можу видалити віддалені кілька об'єднаних дистанційних?

Більше тла;

У мене є git repo з десятками дистанційних, які були об'єднані в майстер. Я можу видалити ці віддалені по одному, використовуючи:

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вказує команді включити походження.
grep -v 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очищення пропущених посилань. Це нічого не робить, тому що всі ці пульти існують.

Тож я прошу вас, шановний обмін стеками;

  • Чому я можу видалити один пульт, але не багато?
  • Чи правильна моя команда?

Я думаю, що я пропускаю щось маленьке. Кожен раз, коли я це досліджую, здається, що я роблю це правильно, але я отримую вищезазначені помилки.

Відповіді:


226

Можливо, потрібно спочатку обрізати свій локальний «кеш» віддалених гілок. Спробуйте запустити:

git fetch -p origin

перед видаленням.


2
Це вирішило це для мене, дякую! Однак чому це не оновлюється, коли я берусь без нього --prune? На мою думку, це досить оману
dave0688

6
Лише зауваження для людей, які приїжджають сюди з пошуку - хоча це, очевидно, корисно для більшості, хто приземлився тут, насправді це не коректно з точки зору початкового питання, - проблема ОП полягала в тому, що його команда була неправильно включена 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
у вашій другій, трубовій команді, поставте ехо поруч, 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 {}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.