Очистка старых смерженных веток в удалённом 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