Recently I was creating a Git alias for logs that used
--date=human for date formatting, before realizing this option had only been added in Git 2.21. After pulling the alias to some of my other machines and seeing that it failed, I decided I wanted a conditional line in my Git config that tested my current version of Git, used
--date=human if possible, and
--date=short if not.
Git’s config syntax doesn’t allow for conditionals, but it does allow for the running of arbitrary bits of shell script. For instance, something like this will work:
[alias] lg = "!if (( "1 > 2" )); then git log --oneline; else git log; fi"
Because 1 is not greater than 2,
git lg will perform a standard
How do we compare our version of Git to a specific value, then? Let’s figure out how to get just our version number of Git first:
$ git --version | sed -E 's/git version ([0-9]+.[0-9]+).*/\1/g'
For me this returns
2.29. We need to check that this is greater than
2.20. Let’s try this:
$ if (( "2.29 > 2.20" )); then echo "Compatible"; else echo "Not compatible"; fi
Why doesn’t this work? I’m getting an
invalid arithmetic operator error.
Turns out Bash only handles integer math, so we need to pipe our comparison expression to a basic calculator program:
$ if (( $(echo "2.29 > 2.20" | bc) )); then echo "Compatible"; else echo "Not compatible"; fi
Great! Works for me. Now we just need to get our actual Git version in there instead of the literal
After some struggle — the
\1 reference in
sed needs to be double-escaped here, for some reason — this is the result:
[alias] lg = "!if (( \ $(echo \"$(git --version | sed -E 's/git version ([0-9]+.[0-9]+).*/\\1/') > 2.20\" | bc) \ )); then \ DATE="--date=human"; \ else \ DATE="--date=short"; \ fi; \ git log --pretty=format:\"%h %ad %s\" $DATE"
git lg will show a single-line log with “human”-formatted date if possible, or a “short”-formatted date if not.
I’ve created a Gist that puts this all together.