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

© Habrahabr.ru