5

Git is used at work. The number of branches is growing and growing. The aim is to remove branches that are older than X weeks.

Attempt 1

Running git branch -h will probably indicate what to run to check when a branch has been created.

user@localhost $ git branch -h
usage: git branch [<options>] [-r | -a] [--merged | --no-merged]
   or: git branch [<options>] [-l] [-f] <branch-name> [<start-point>]
   or: git branch [<options>] [-r] (-d | -D) <branch-name>...
   or: git branch [<options>] (-m | -M) [<old-branch>] <new-branch>
   or: git branch [<options>] [-r | -a] [--points-at]

Generic options
    -v, --verbose         show hash and subject, give twice for upstream branch
    -q, --quiet           suppress informational messages
    -t, --track           set up tracking mode (see git-pull(1))
    --set-upstream        change upstream info
    -u, --set-upstream-to <upstream>
                          change the upstream info
    --unset-upstream      Unset the upstream info
    --color[=<when>]      use colored output
    -r, --remotes         act on remote-tracking branches
    --contains <commit>   print only branches that contain the commit
    --abbrev[=<n>]        use <n> digits to display SHA-1s

Specific git-branch actions:
    -a, --all             list both remote-tracking and local branches
    -d, --delete          delete fully merged branch
    -D                    delete branch (even if not merged)
    -m, --move            move/rename a branch and its reflog
    -M                    move/rename a branch, even if target exists
    --list                list branch names
    -l, --create-reflog   create the branch's reflog
    --edit-description    edit the description for the branch
    -f, --force           force creation, move/rename, deletion
    --merged <commit>     print only branches that are merged
    --no-merged <commit>  print only branches that are not merged
    --column[=<style>]    list branches in columns
    --sort <key>          field name to sort on
    --points-at <object>  print only branches of the object

Attempt 2

This post https://stackoverflow.com/questions/3184555/cleaning-up-old-remote-git-branches was found, but this is not an option as it removes branches without checking the age.

  • Git doesn't store creation date of branches afaik. Is it ok to remove branches that haven't been committed to recently? – Xiong Chiamiov Feb 9 '18 at 21:59
  • @XiongChiamiov What is your definition of recently? – 030 Feb 9 '18 at 22:07
  • Whatever it is you want. The important part of that sentence is "committed to" versus "created". – Xiong Chiamiov Feb 12 '18 at 20:18
6

Note: this answer shows how to find branches that have been *updated* a long time ago, not branches that have been *created* (i.e., spliced off of some parent) a long time ago. I believe this is what the OP actually wanted (as opposed to the title he chose for the question), as this would lead to good candidates for deletion.

You have to recall that a branch in git is nothing "physical". It is, by definition, and literally, only a simple text file in .git/refs which only has its file name (which is the branch name) and the hash of the tip/head commit. It has no date information or anything else.

So git branch will not help you here.

The object type that has dates associated with it are commits, in git. So you have to list commits. This is done with git log.

So a working command would be:

git log --remotes --before 2018-01-01 --no-walk --decorate

You can read up the details on https://www.git-scm.com/docs/git-log , but in short, it means

  • --remotes: start with any and all remote branches (substitute --branches for local branches)
  • --before ...: only list commits older than the date given
  • --no-walk: only list the very first commit for each branch, don't walk back the history
  • --decorate: display all tag and branch names associated, just in case

This will give you all branch heads that are older than your given date.

  • The branches older than X are shown (+1), but also some details. Would it also be possible to just return the branch names, like the output of git branch? – 030 Feb 11 '18 at 13:37
  • See this SO answer stackoverflow.com/questions/10325599/… – Vorsprung Feb 11 '18 at 16:13
  • Sure, @030, the --format option can be used to only output the ref (branch) names, if needed. Vorsprung also linked a duplicate question which uses little bash scripts to iterate over the branches and deletes stuff. – AnoE Feb 11 '18 at 19:24

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.