Очистка старых смерженных веток в удалённом git репозитории

Зайчатки разума

Записная книжка айтишника

Очистка старых смерженных веток в удалённом git репозитории

2019-03-01 20:48:21 — Evgeniy Shumilov

  Не так давно по работе я столкнулся с задачей - необходимо было очистить большой репозиторий на гитхабе от всех веток, которые были полностью смержены в мастер, позднее, чем N дней. Для этого пришлось написать небольшой скрипт, который я просто оставлю ниже.


#!/bin/sh
# Script for removing all remote full-merged branches from 
# remote repository by Evgeniy Shumilov <evgeniy.shumilov@gmail.com>

set -e

help() {
 echo "This script is made for removing old fully-merged branches from remote
repository. Remote repository should be connected as origin.

 * First parameter is path to git local copy.
 * Second parameter is count of days for saving branches (default=90).
 * Third parameter is for force (default=no).

Branch date is the date of the last commit. Script runs by default in dry run mode.

Syntax:
 $0 </path/to/git/repo> [count of days] [force]

Usage examples:
 $0 ~/gitrepo # for dry run mode whith 90 days saving period
 $0 ~/gitrepo 120 # for dry run mode
 $0 ~/gitrepo 150 force # for removing full-merged branches older than 150 days
 $0 ~/gitrepo '' force # for removing full-merged branches older than 90 days"
 exit 1
}


[ -z "$1" ] && help
[ -n "$2" ] && DAYS="$2" || DAYS=90
TDELTA=$(( `date +%s` - $DAYS * 86400 ))

cd "$1"
git fetch -p origin
branches=`git branch -r --merged master | grep -vF '* master'`
IFS='
'
for b in $branches; do
 bname=`echo "$b" | sed 's/^[ ]*\(remotes\/\)\?//'`
 blastdate=`git log "$bname" --format='%at' -1`
 if [ -n "$(echo "$bname" | sed '/^origin\//!d')" ]; then
   bremote='origin'
   bname=`echo "$bname" | sed 's#origin/##'`
 else
   bremote=''
 fi
 if [ "$blastdate" -lt "$TDELTA" ]; then
   echo "Branch $bname last commit: $(date -d @$blastdate +%F)"
   if [ "$3" == "force" ]; then
     [ -n "$bremote" ] && git push "$bremote" --delete "$bname"
   fi
 fi
done
git fetch -p origin

  Запуск без параметров выведет краткую справку. Первый параметр - количество дней, после которых нужно удалить ветки. Третий параметр должен принимать значение force, если вы хотите запустить скрипт в боевом режиме. По умолчанию он работает в dry-run режиме.

Теги: админское, shell, automatization

comments powered by Disqus