unixorn/git-extra-commands

View on GitHub
bin/git-trail

Summary

Maintainability
Test Coverage
#!/bin/sh -e
#
# https://leahneukirchen.org/blog/archive/2013/01/a-grab-bag-of-git-tricks.html
#
# git trail [-r] [-t] [COMMIT] - show all branching points in Git history

[ "$1" = -r ] && shift || REMOTES="-e refs/remotes/"
[ "$1" = -t ] && shift || TAGS="-e refs/tags/"
COMMIT=$(git rev-parse --no-flags --default HEAD "$@")

{ git for-each-ref | grep -v -e '^$' $TAGS $REMOTES
  git log --date=short --format="%cd %h %H" "$@"
} | awk '
    $2 == "commit" || $2 == "tag" {
      "git merge-base '"$COMMIT"' " $1 | getline mb
      merge[mb] = merge[mb] " " $3
    }
    {
      if ($3 in merge) {
        split(merge[$3], mbs, " ")
        for (i in mbs) {
          "git name-rev --name-only --refs=\"" mbs[i] "\" " $3 | getline nr
          if (nr != "undefined") print $1, $2, nr   # skip unreachable commits
        }
      }
    }' | git -p column   # paginate output