Подтвердить что ты не робот

Удалите несколько удаленных ветвей в git

У меня есть член команды, который непреднамеренно отодвинул более 150 своих локальных отделений к нашему центральному репо. К счастью, все они имеют один и тот же префикс. Используя этот префикс, есть ли команда git или классная маленькая оболочка script, которую я могу использовать, которая удалит все из них сразу?

4b9b3361

Ответ 1

Используйте следующую команду для удаления всех ветвей с префиксом PREFIX на удаленном сервере.

git branch -r | awk -F/ '/\/PREFIX/{print $2}' | xargs -I {} git push origin :{}

Вы можете сначала выполнить сухую проверку, чтобы увидеть, есть ли ветки, которые вы хотите удалить:

git branch -r | awk -F/ '/\/PREFIX/{print $2}'

Ответ 2

Если вам нравится более простой подход, например, удалите 3 или 4 ветки:

git push origin --delete <branch1> <branch2> <branch3>

Важно: Работает только с Git v1.7.0 и выше.

Ответ 3

Благодаря Neevek для отличного и элегантного решения!

Но у меня есть проблемы со слэшами в именах ветвей (я использую Git Flow) из-за разделителя полей awk / (-F)

Итак, мое решение основано на Neevek's, но правильно разбирает имена ветвей с помощью /. В этом случае я предполагаю, что ваш пульт называется origin. Команда для удаления удаленных ветвей с именами, смотрящими с помощью PATTERN:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2}' | xargs -I {} git push origin :{}

И не забудьте проверить, что вы собираетесь удалить:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2}'

ПОЛЕЗНЫЙ СОВЕТ: Если имена ваших ветвей (без префикса origin/), хранящиеся в текстовом файле (одно название ветки для каждой строки), просто запустите:

cat your_file.txt | xargs -I {} git push origin :{}

Ответ 4

То же самое с grep: git branch -r | grep -Eo 'PREFIX/.*' | xargs -i git push origin :{}.

branch -r показывает origin/prefix/branchname. Это займет prefix/branchname.

Ответ 5

Решение Neevek элегантно, но может быть лучше: решение как предлагаемые вызовы git push "один раз для каждой ветки, что означает дополнительную маршрутизацию сети на каждую ветвь, которую нужно удалить. Так как вы все равно используете awk, почему бы не использовать его для префикса ':', а затем xargs могут называть 'git push' ровно один раз и сразу удалять все ветки:

Сухой запуск для отображения ветвей, которые будут удалены:

git branch -r | awk -F/ '/\/PREFIX/{print ":" $2}'

Окончательное решение для фактического нажатия на удаление:

git branch -r | awk -F/ '/\/PREFIX/{print ":" $2}' | xargs git push origin

Ответ 6

ресурс https://coderwall.com/p/eis0ba

    1 - List all your remote branches:

    $ git branch -r

    2 - Filter the branches by some regular expression. In this case I'm interested in deleting any branch with the 'feature-' prefix:

    $ git branch -r | awk -F/ '/\/feature-/{print $2}'
    3 - Pipe the last command to git push to delete them:
    # **Edit** - Removed extra colon, which is not needed
    $ git branch -r | awk -F/ '/\/feature-/{print $2}' | xargs -I {} git push origin {}
    4 - Grab a beer.

    5 - Remove any local reference to those branches:

    $ git remote prune origin

Ответ 7

Это может быть повторяющийся ответ, но ниже проверено и работает для меня отлично.

  1. Удалять локальную ветку принудительно

git branch -D имя-ветки

  1. Удалить удаленную ветку

git push origin - -D elete branch-name

  1. Удалить более 1 локального ветки

git branch -D branch-name1 branch-name2

  1. Удалить более 1 удаленной ветки

git push origin - -D elete branch-name1 branch-name2

  1. Удалить локальную ветку с префиксом. Например, функция /*

git branch -D $ (git branch --list 'feature/*')

git branch -D backticks $ (git branch --list 'feature/*' backticks)

  1. Список удаленных веток с префиксом.

git branch -r | grep -Eo 'feature/.*'

  1. Удалить удаленную ветку с префиксом

git branch -r | grep -Eo 'feature/.*' | xargs -I {} происхождение git push: {}

Ответ 8

Благодаря Стиву и Нивеку, я нашел решение, которое очень хорошо работало для меня, я решил, что стоит поделиться:

Решение Steve работало для меня с одной незначительной корректировкой. Мои пульты были названы origin/feature/some-feature-name, поэтому я обрезал ваш awk:

git branch -r | awk -Forigin/ '/\/feature/ {print $2 $3}' | xargs -I {} git push origin :{}

Теперь он делает небольшой поток удаления:

To github.com:project/project-name.git
- [deleted]         feature/search-min-chars
To github.com:project/project-name.git
- [deleted]         feature/search-placeholder
To github.com:project/project-name.git
- [deleted]         feature/server-error-message
To github.com:project/project-name.git
- [deleted]         feature/six-point-asterisk

Было ли интересно, есть ли у кого-нибудь идеи для более элегантного решения, что могло бы вывести что-то вроде этого (мои сценарии CLI довольно плохие, так что мне понадобилось бы некоторое время, чтобы понять это):

git push origin :feature/search-min-chars :feature/search-placeholder :feature/server-error-message :feature/six-point-asterisk

Это приведет к хорошему одиночному выходу с одним сетевым запросом:

To github.com:project/project-name.git
- [deleted]         feature/search-min-chars
- [deleted]         feature/search-placeholder
- [deleted]         feature/server-error-message
- [deleted]         feature/six-point-asterisk

Ответ 9

Благодаря Нивеку. Это хорошо сработало после перенастройки для моей цели:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2 "/" $3}' | xargs -I {} git push origin :{}

Мне также понадобилось учитывать структуру папок. Мои ветки функций находятся в структуре папок, такой как origin/feature/PREFIX-FEATURENUMBER. Поэтому мне пришлось создать свой шаблон из $2 = folder + $3 = branchname.

Ответ 10

Каждый использует awk, не уверен, почему. Я чувствую себя более сложным. Вот что я использую для удаления всех удаленных ветвей на моем удаленном пуле fork:

$ git branch -r --list 'fork/*' | sed 's/fork\///' | xargs git push --delete fork

Введите grep между xargs и sed, если вам нужно отфильтровать список только до подмножества удаленных ветвей.

Ответ 11

Я понимаю, что это для команды git, но если вы ищете альтернативное решение для того же или того же результата:

Вы можете сделать это отсюда (Git Remove Remote Branches):

Затем выберите ветки, которые вы хотите:

Убедитесь, что у вас есть разрешения на удаление удаленных веток.

Ответ 12

Github также имеет хороший интерфейс и механизм для быстрого удаления ветвей, что, если вы предпочитаете использовать пользовательский интерфейс

Ответ 13

Я попытался удалить все удаленные ветки origin/release/r1-1 *, поэтому после удобной командной строки.

git branch -r | awk -Forigin/ '/\/*r1-1/ {print $2}' |  xargs -I {} git push origin :{}

Ответ 14

Я не мог использовать awk, потому что мы используем структуру слэш для имени наших ветвей.

git branch -r | grep "origin/users/YOURNAME" | sed -r 's/^.{9}//'| xargs -i  sh -c 'git push origin --delete {}'

Получите всю удаленную ветвь, получите только одну для одного пользователя, удалите строку "origin/" и выполните удаление на каждом из них.

Ответ 15

Предупреждение. Это приведет к удалению всех удаленных веток. Используйте с осторожностью.

Я думаю, что лучший способ удалить удаленные ветки.

Предупреждение. Это приведет к удалению всех удаленных ветвей.

git branch -r | grep -v master | sed 's/origin\//:/'| xargs git push