У меня есть член команды, который непреднамеренно переместил более 150 своих местных филиалов в наше центральное репо. К счастью, все они имеют одинаковый префикс. Можно ли использовать этот префикс с помощью команды git или классного небольшого сценария оболочки, который удалит все их сразу?
129
$ git branch -r | awk -F/ '/\/APR/{print $2}' | xargs -I {} git push origin :{} error: unable to push to unqualified destination: APR-04-DPH The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. error: failed to push some refs to 'GIT_URL'
git branch -r | awk -F/ '/\/APR/{print $2}'
, могли бы вы увидеть все перечисленные имена веток с префиксом APR?APR-04-DPH
ветка уже была удалена. Взгляните на эти ответы на вопросы: это и это, а также это . Ответы на эти вопросы касаются той же проблемы, возможно, вы захотите самостоятельно протестировать решения.git branch -r | awk -F/ '/\/PREFIX/{print $2"/"$3}' | xargs -I % git push origin --delete %
Если вам нравится более простой подход, например удалите 3 или 4 ветки:
Важно: работает только с Git v1.7.0 и выше.
источник
git branch -r | awk -F/ '/\/PATTERN/{print $2}' | xargs git push origin --delete
Спасибо Neevek за отличное и элегантное решение!
Но у меня проблемы с косой чертой в именах веток (я использую Git Flow) из-за
awk
разделителя полей/
(-F
опция)Итак, мое решение основано на Neevek , но правильно анализирует имена веток с помощью
/
. В этом случае я предполагаю, что ваш пульт позвонилorigin
. Команда для удаления удаленных веток с именами, начинающимися сPATTERN
:И не забудьте проверить, что вы собираетесь удалить:
ПОЛЕЗНЫЙ СОВЕТ: если имена ваших веток (без
origin/
префикса) хранятся в текстовом файле (по одному имени ветки в строке), просто запустите:источник
xargs -a file -L
вместоcat file | xargs
. Еще прощеxargs -a file git push --delete origin
.Это может быть повторяющийся ответ, но ниже проверено и отлично сработало для меня.
git branch -D обратные кавычки $ (git branch --list 'feature / *' backticks )
источник
То же самое с Grep:
git branch -r | grep -Eo 'PREFIX/.*' | xargs -i git push origin :{}
.branch -r
показываетorigin/prefix/branchname
. Так что потребуетсяprefix/branchname
.источник
xargs -I {} git push origin :{}
, что нет-i
.-i
он использует замену по умолчанию для,{}
но-I
вы можете объявить свою собственную. ... только что нашел в руководстве:-i ... the same as -I{}
Решение Neevek элегантно, но может быть лучше: предлагаемое решение вызывает «git push» один раз для каждой ветви, что означает удаление дополнительных сетевых циклов приема-передачи для каждой ветви. Поскольку вы все равно используете awk, почему бы не использовать его для префикса ':', а затем xargs может вызвать 'git push' ровно один раз и сразу удалить все ветки:
Выполните пробный прогон, чтобы составить список ветвей, которые будут удалены:
Окончательное решение для фактического удаления удалений:
источник
xargs: replstr may not be empty
решение Neevek, возможно, версия git ..git version 1.9.5
Но это отлично сработало для меня. Спасибо вам обоимресурс https://coderwall.com/p/eis0ba
источник
Благодаря Стиву и Нивеку я нашел решение, которое мне очень понравилось, и я решил, что стоит поделиться:
Решение Стива сработало для меня с одной незначительной поправкой. Мои пульты были названы,
origin/feature/some-feature-name
поэтому я обрезал вашиawk
:Теперь он выполняет небольшой поток удаления:
Интересно, есть ли у кого-нибудь идеи для более элегантного решения, которое могло бы выводить что-то вроде этого (мой сценарий CLI довольно плох, поэтому мне потребовалось некоторое время, чтобы понять это):
Это приведет к хорошему одиночному выводу с одним сетевым запросом:
источник
Спасибо Neevek. Это хорошо сработало после перенастройки его для моей цели:
Мне также нужно было учитывать структуру папок. Мои ветки функций находятся в такой структуре папок, как origin / feature / PREFIX-FEATURENUMBER. Итак, мне пришлось создать свой шаблон из $ 2 = папка + $ 3 = название ветви.
источник
Все используют
awk
, не знаю почему. Я чувствую, что это более сложно. Вот что я использую для удаления всех удаленных веток на моемfork
пульте дистанционного управления:Добавьте
grep
междуxargs
и,sed
если вам нужно отфильтровать список только до подмножества удаленных ветвей.источник
origin/blaprefix_anotherbla
. Но использованиеsed
справилось с этим хорошо. Еще одно преимущество этого подхода заключается в том, что я использую битбакет, и мне не нужно вручную вводить пароль аутентификации для каждого удаления ветки. Он удаляет все ветки одним пакетом.git branch -r | egrep 'origin/greenkeeper' | sed 's/origin\///' | xargs -I {} git push origin --delete {}
Я понимаю, что это для команды git, но если вы ищете альтернативное решение для получения аналогичного или такого же результата:
Вы можете сделать это отсюда (Git Remove Remote Branch):
Затем выберите нужные ветки:
Убедитесь, что у вас есть разрешения на удаление удаленных веток.
источник
Github также имеет приятный пользовательский интерфейс и механизм для быстрого удаления веток, если вы предпочитаете использовать пользовательский интерфейс.
источник
Я попытался удалить все удаленные ветки origin / release / r1-1 *, поэтому следующая командная строка работала нормально.
источник
Мне не удалось использовать awk, потому что мы используем структуру косой черты для имен наших веток.
Это получить всю удаленную ветку, получить только одну для одного пользователя, удалить строку «origin /» и выполнить удаление для каждого из них.
источник
Прогон, репетиция:
Удаляем удаленные ветки:
Удалите только полностью объединенные удаленные ветки:
Объяснение:
sed "s/origin\///"
удалитorigin/
из названия ветки. Не убирая этого, я получил:remote ref does not exist
источник
Предыдущие ответы помогли мне удалить все ветки выпуска с 2018 года. Я запустил это в командной строке Windows 10. Я установил clink , так что команды типа Linux работают для меня.
Прогон, репетиция:
Если пробный прогон показывает ветви, которые не находятся в удаленном / исходном. Запустите команду git prune, чтобы исправить, и проверьте снова.
Удалите, если вас устраивает результат выше:
Если вы видите:
error: unable to delete 'release-...2018': remote ref does not exist
. Затем запустите предыдущую команду prune и попробуйте еще раз.источник
Предупреждение: это удалит все удаленные ветки. Используйте с осторожностью.
Я думаю, что мой способ удаления удаленных веток - лучший.
Предупреждение: это удалит все удаленные ветки. Используйте с осторожностью.
источник