How can I make git log order based on author's timestamp?
GitSortingTimestampGit LogGit Problem Overview
I use a fairly complex git-log
command involving --date-order
to get an overview of my repository's status; but unfortunately, --date-order
seems to use the committer date, not the author date. That means that each time I bring my topic branches up to date by rebasing them onto the current upstream, I lose the helpful chronological ordering in my git-log
of relative commits in my topic branches (that is, each branch becomes a single long line, because all of its commits got rebased to sequential and nearly-identical committer timestamps.)
If I could get git-log
to order commits by the author timestamp instead of the committer timestamp, this would be solved. Does anybody know of a way to do that?
For those visiting this from Google results, you may want to look into josephdpurcell's solution (and in-depth blog post!), below. It's quite excellent, if you're looking for standard git-log
style output, multi-line, with detailed messages about each commit.
Unfortunate, I now need to amend this question, because I'm an idiot and didn't provide more specific information about my use-case: I use git-log
in “--graph
mode,” and I need to make git-log
itself operate in author-date-order. As far as I've been able to ascertain, this is completely impossible to do from outside git-log
, because git-log
itself handles the graph ordering and printing.
A script, or patch for git-log
, may be necessary, it seems. I'll leave this open until somebody can either 1. write such a script, or 2. we can talk the git
authors into including a --author --date-order
combination of flags. (=
For reference, here's what my current glog
function's output looks like, and what I need to re-order:
Git Solutions
Solution 1 - Git
git version 1.8.4 added an --author-date-order
argument to git log
; according to the release notes, "the output is topologically sorted and commits in parallel histories are shown intermixed together based on the author timestamp."
Solution 2 - Git
Okay, this took me a very long time to figure out (details). In short, I found many examples that were either incomplete or incorrect. The following command does what I think you would expect:
$ git log --pretty="format:%at %C(yellow)commit %H%Creset\nAuthor: %an <%ae>\nDate: %aD\n\n %s\n" | sort -r | cut -d" " -f2- | sed -e "s/\\\n/\\`echo -e '\n\r'`/g" | tr -d '\15\32' | less -R
You can find this script and others in Git Extras on GitHub.
Solution 3 - Git
--date-order
/--topo-order
really just controls the ordering of commits in a revision list when you are viewing multiple branches running alongside another. The "x is-a-parent of y" relationship is always respected, even if your committer/authoring timestamp is in the distant past or future.
You'd need something like git log --pretty="format:%at %H" | sort -g
and then feed the hashes back into git log
.
Solution 4 - Git
Building off of what jørgensen suggested there is a "one-liner" solution that may give you what you are looking for. Formatted here for easier viewing. Improvements are welcomed!
SORTED_GIT_LOGS=$(git log --pretty="format:%at %H" | sort -g | cut -d' ' -f2); \
IFS=$(echo -en "\n\b"); for LOG in $SORTED_GIT_LOGS; do \
git show --name-only $LOG; \
done | less