如何使git log按作者时间戳排序?

64
我使用了一个相当复杂的`git-log`命令,其中包括`--date-order`,以获得我的存储库状态的概述;但不幸的是,`--date-order`似乎使用的是提交者日期,而不是作者日期。这意味着每次我通过将主题分支重新定位到当前上游来更新它们时,我都会失去在我的`git-log`中相对提交的有用时间顺序(也就是说,每个分支都变成了单一的长行,因为它的所有提交都被重新定位到连续且几乎相同的提交者时间戳)。如果我可以让`git-log`按照作者时间戳而不是提交者时间戳排序提交,这个问题就会得到解决。有人知道如何做到这一点吗?

对于从谷歌搜索结果中访问本问题的人,您可能想查看下面josephdpurcell的解决方案(以及in-depth blog post!)。如果您正在寻找标准的git-log风格输出、多行且包含有关每个提交的详细消息,则这是非常优秀的。

不幸的是,我现在需要修改这个问题,因为我很蠢,没有提供更具体的有关我的用例的信息:我在“--graph模式”下使用git-log,并且我需要使git-log本身按作者日期顺序操作。据我所知,这是完全不可能从git-log外部实现的,因为git-log 本身处理图形排序和打印。

似乎需要一个脚本或git-log的补丁。我将保持此问题的开放状态,直到有人能够编写这样的脚本,或者我们可以说服git的作者包括一个--author --date-order组合标志。(=


作为参考,这是我当前glog函数的输出情况,以及我需要重新排序的内容:

glog output

4个回答

81

Git版本1.8.4添加了一个--author-date-order参数来控制git log命令的输出顺序。根据发布说明,"输出按拓扑排序,并且并行历史中的提交将根据作者时间戳交织在一起显示。"


3
呵呵。我实际上已经完成了这里的很多工作(在发表这个问题后),但没意识到它已经整理好并被加入主线。很酷!感谢提醒。我将测试它是否确实解决了我的实际原始问题,然后可能会接受这个答案。 - ELLIOTTCABLE
2
我遇到了相同(或非常相似)的问题,将这个添加到我的日志别名中使它现在更易读。谢谢! - zshift

24

好的,这让我花费了很长时间才想明白(详情)。简而言之,我发现许多示例要么不完整,要么不正确。以下命令执行我认为你期望的操作:

$ 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

您可以在GitHub上的Git Extras找到此脚本和其他脚本。


+1 是的!简单而甜美。同时也为整个博客解释点赞。 - Alexander Bird
1
如果您想将其转换为别名:alias prettylog=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"` - Druska
我实际上是在寻找你解决方案的前身(我正在设置一行日志;因此所有多行和tr无关紧要)...但由于你将所有研究压缩成了一篇博客文章(你这个狡猾的家伙!),我能够使用你以前的其中一个版本。这是我从S.O.得到的最好的回答;希望我能给你点赞两次。 (= - ELLIOTTCABLE
2
我对这个解决方案感到非常兴奋,直到意识到它不支持 --graph,这完全让我失望。没有 --graph,我无法看到我的历史记录的结构,这使得 git-log 对我来说毫无用处。 >: - ELLIOTTCABLE

12

--date-order/--topo-order 实际上只是控制在同时查看多个分支时修订记录中提交的顺序。即使你的提交者/作者时间戳在遥远的过去或未来,也始终尊重“x是y的父节点”的关系。

您需要使用类似于 git log --pretty="format:%at %H" | sort -g,然后将哈希值输入到 git log 中。


2
建议结合jørgensen的建议,有一个“一行代码”解决方案可以满足您的需求。以下是更易于查看的格式。欢迎改进!
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接