Today I Learned (Series)

Print the underlying command whenever you run a Git alias

Published on Friday, June 10, 2022

bashgittil

In a recent pair programming session, someone mentioned that it was a little hard to follow my command line workflow due to my regular use of Git aliases. As someone who enjoys pair programming, I decided to take that feedback to heart and figure out a way to make the experience better for my future pairing partners. I landed on a solution that prints the underlying command of a Git alias any time I run one.

Imagine you have an alias called git l that logs the last 3 lines of your git log output in a custom format. The configuration for such an alias might look something like this.

# ~/.gitconfig[alias]  l = log --graph --oneline --max-count 3
$ git l* 9f363ea (HEAD -> main, origin/main, origin/HEAD) Fix publish timestamp* 54e7287 Add TIL series, update design, other improvements* f235f4f Add support for comments with Giscus

As you can see, the underlying command is obscured by the alias, so a third-party observer could only reason about what is actually happening by examining the output. All hope is not lost though.

Since an alias can invoke an external command with the ! character, we can rewrite our aliases to take advantage of the Bash set builtin. According to the docs, any single-character set option can be used when invoking the shell. This feature, along with the behavior of the set -v option, makes for a concise solution to our problem.

# ~/.gitconfig[alias]  l = !bash -v -c 'git log --graph --oneline --max-count 3'
$ git lgit log --graph --oneline --max-count 3 # <- the underlying command* 9f363ea (HEAD -> main, origin/main, origin/HEAD) Fix publish timestamp* 54e7287 Add TIL series, update design, other improvements* f235f4f Add support for comments with Giscus

Now, one problem with this approach compared to the typical l = log format above is that tab completion is broken. Check out How to fix tab completion for complex Git aliases to learn more about how to fix it!

If you found this post useful, have a question, or just want to say hi, please leave a comment down below. Thanks for reading, and happy coding. ✌️

Stay current in the evolving world of web development.

I use Revue for my newsletter. See their terms of service and privacy policy.