Git log over multiple local repos

Wed, Mar 16, 2022

I find my self at work executing a for loop in bash in order to get some information out of multiple git repos in one hit. This time I thought it would be useful to create a small script (the thing I keep executing) and to invoke it from a git alias.

First step is to create the alias. I have called it dlog as in distributed log command.

git config --global alias.dlog '!bash ~/scripts/git/gitdlog.sh'

Next make sure the directory exists.

mkdir -p ~/scripts/git/

Finally add the following to the file ~/scripts/git/gitdlog.sh

#!/usr/bin/env bash
find "$GIT_PREFIX./" -name ".git" | 
  while read -r line;
  do
    (cd "${line/.git/}" && git --no-pager log "$@")
  done 

Now git dlog can be used in place of git log but still using the same command line flags and arguments as this script applied those flags and arguments you supply once to each invocation of git log. The script uses find command to get all the .git directories and return the parent directory. A sub shell is then used to run git log and output as normal.