Удаление слитых веток, которых нет в origin

от автора

Так уж повелось, что при разработке приходится создавать много веток в репозитории, но после выкатки очередной задачи или фикса в продакшн я забываю удалять старые ветки. Поэтому зайдя в очередной раз в 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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *