Так уж повелось, что при разработке приходится создавать много веток в репозитории, но после выкатки очередной задачи или фикса в продакшн я забываю удалять старые ветки. Поэтому зайдя в очередной раз в PhpStorm, я понял, что не могу найти нужную мне ветку среди пары сотен локальных веток. Первая мысль: нужно удалить старые ветки, но как, их же несколько сотен.
Поскольку я очень ленивый (иначе бы сразу удалял мусор), я начал искать готовое решение. И вроде бы вот оно, git remote prune origin должен решить все мои проблемы… И не решил. Не знаю, почему, но команда просто не захотела работать.
Что мы имеем?
Пара сотен локальных веток… Примерно столько же веток в Origin. Некоторые ветки слиты с мастером, некоторые нет. Поскольку в продакшн попадают только ветки, которые слитые в мастер, сравнивать нужно именно с ним. В этом поможет git branch —merged. Отлично, но при тестировании выясняется, что из-за того, что около текущей ветки ставится * (астериск), bash думает, что мы хотим вывести список файлов каталога… Убираем master (что логично, он ведь и не должен быть удален).
#!/bin/bash if test 0 -eq `git status | grep '# On branch master' | wc -l` then `git checkout master` `git pull origin master` fi; echo 'Будут удалены все слитые в master ветки, которых нет в Origin'; echo 'Вы уверены? [Y/n]'; read answer; if test 'Y' = $answer then local_branches=`git branch --merged | grep -v '*'`; elif test 'n' = answer then exit; fi;
Теперь нужно найти все ветки, которых нет в Origin. Я не придумал ничего умнее, кроме как в цикле пробежаться по выдаче git branch -r и грепнуть текущую ветку… Получилось что-то типа такого:
for b in $local_branches; do if test 0 -eq `git branch -r | grep $b | wc -l` then echo "$b нет в origin"; fi; done
Остается только удалить ветки, которые удовлетворяют условию и готово.
Итоговый скрипт:
#!/bin/bash if test 0 -eq `git status | grep '# On branch master' | wc -l` then `git checkout master` `git pull origin master` fi; echo 'Будут удалены все слитые в master ветки, которых нет в Origin'; echo 'Вы уверены? [Y/n]'; read answer; if test 'Y' = $answer then local_branches=`git branch --merged | grep -v '*'`; for b in $local_branches; do if test 0 -eq `git branch -r | grep $b | wc -l` then echo $b; `git branch -d $b`; `git branch -D $b`; fi; done elif test 'n' = answer then exit; fi;
ссылка на оригинал статьи http://habrahabr.ru/post/269421/
Добавить комментарий