Search code examples
gitshell

Delete all branches that are more than X days/weeks old


I found the below script that lists the branches by date. How do I filter this to exclude newer branches and feed the results into the Git delete command?

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

Solution

  • How about using --since and --before?

    For example, this will delete all branches that have not received any commits for a week:

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

    If you want to delete all branches that are more than a week old, use --before:

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

    Be warned though that this will also delete branches that where not merged into master or whatever the checked out branch is.