[Из песочницы] Удаление слитых веток, которых нет в 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;