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

Удалите все ветки, которые больше, чем X дней/недель

Я нашел ниже script, в котором перечислены ветки по дате. Как отфильтровать это, чтобы исключить новые ветки и подавать результаты в команду Git delete?

for k in $(git branch | sed /\*/d); do 
  echo "$(git log -1 --pretty=format:"%ct" $k) $k"
done | sort -r | awk '{print $2}'
4b9b3361

Ответ 1

Как насчет использования --since и --before?

Например, это приведет к удалению всех ветвей, которые не получили никаких фиксаций в течение недели:

for k in $(git branch | sed /\*/d); do 
  if [ -n "$(git log -1 --since='1 week ago' -s $k)" ]; then
    git branch -D $k
  fi
done

Если вы хотите удалить все ветки, возраст которых превышает неделю, используйте --before:

for k in $(git branch | sed /\*/d); do 
  if [ -n "$(git log -1 --before='1 week ago' -s $k)" ]; then
    git branch -D $k
  fi
done

Будем предупреждать, что это также удалит ветки, которые не объединены в мастер или независимо от того, в какой ветке проверена.

Ответ 2

Метод бедняков:

Список веток по дате последнего коммита:

git branch --sort=committerdate | xargs echo

это перечислит ветки, в то время как xargs echo сделает это встроенным (спасибо Джесси).

В начале вы увидите все свои ветки со старыми:

1_branch 2_branch 3_branch 4_branch

Скопируйте первые n, которые устарели и вставьте в конце команды пакетного удаления:

git branch -D 1_branch 2_branch

Ответ 3

Это что-то похожее на Даниэль Баулиг, но также принимает во внимание комментарий ben. Также он фильтрует ветки по заданному patter, так как мы используем соглашение try-XX для ветвления.

for k in $(git branch -r | awk -F/ '/\/YOUR_PREFIX_HERE/{print $2}' | sed /\*/d); do
   if [ -z "$(git log -1 --since='Jul 31, 2015' -s origin/$k)" ]; then
     echo deleting "$(git log -1 --pretty=format:"%ct" origin/$k) origin/$k";
     git push origin --delete $k;
   fi;
done

Ответ 4

Это то, что сработало для меня:

for k in $(git branch -r | sed /\*/d); do 
  if [ -z "$(git log -1 --since='Aug 10, 2016' -s $k)" ]; then
    branch_name_with_no_origin=$(echo $k | sed -e "s/origin\///")
    echo deleting branch: $branch_name_with_no_origin
    git push origin --delete $branch_name_with_no_origin
  fi
done

Важнейшая часть состоит в том, что имя ветки (переменная $k) содержит часть /origin/, например origin/feature/my-cool-new-branch Однако, если вы попытаетесь выполнить git push -delete, он завершится с ошибкой, например:
не удалось удалить 'origin/feature/my-cool-new-branch': remote ref не существует.
Поэтому мы используем sed для удаления части /origin/, чтобы мы остались с именем ветки, например feature/my-cool-new-branch, и теперь будет работать git push -delete.

Ответ 5

Я предполагаю, что вы хотите удалить только ссылки, а не фиксации в ветких. Чтобы удалить все объединенные ветки, кроме последнего __X__:

git branch -d `for k in $(git branch | sed /\*/d); do
  echo "$(git log -1 --pretty=format:"%ct" $k) $k"
done | sort -r | awk 'BEGIN{ORS=" "}; {if(NR>__X__) print $2}'`

Чтобы удалить все ветки до отметки времени __Y__:

git branch -d `for k in $(git branch | sed /\*/d); do
  echo "$(git log -1 --pretty=format:"%ct" $k) $k"
done | sort -r | awk 'BEGIN{ORS=" "}; {if($1<__Y__) print $2}'`

Замените параметр -d на -d, если вы хотите удалить ветки, которые также не были объединены... но будьте осторожны, потому что это приведет к сбою мусора в какой-то момент.

Ответ 6

Приведенный выше код не работал для меня, но он был близок. Вместо этого я использовал следующее:

for k in $(git branch | sed /\*/d); do 
  if [[ ! $(git log -1 --since='2 weeks ago' -s $k) ]]; then
    git branch -D $k
  fi
done

Ответ 7

Основываясь на ответе @daniel-baulig и комментариях, я придумал это:

for k in $(git branch -r --format="%(refname:short)" | sed s#^origin/##); do
   if [ -z "$(git log -1 --since='4 week ago' -s $k)" ]; then
    ## Info about the branches before deleting
    git log -1 --format="%ci %ce - %H $k" -s $k;
    ## Delete from the remote
    git push origin --delete $k;
    ## Delete the local branch, regardless of whether it been merged or not
    git branch -D $k
  fi;
done

Это может быть использовано для удаления всех старых веток (объединены или НЕ). Мотивация для этого состоит в том, что маловероятно, что ветки, которые не были затронуты в течение месяца, гниют и никогда не справляются с этим. Естественно, сроки для обрезки старых веток зависят от того, насколько быстро движется главная ветвь.