如何根据作者的时间戳制作 git log 顺序?

Posted

技术标签:

【中文标题】如何根据作者的时间戳制作 git log 顺序?【英文标题】:How can I make git log order based on author's timestamp? 【发布时间】:2012-01-24 11:29:33 【问题描述】:

我使用涉及--date-order 的相当复杂的git-log 命令来获取我的存储库状态的概览;但不幸的是,--date-order 似乎使用了 committer 日期,而不是 author 日期。这意味着每次我通过将主题分支重新定位到当前上游来更新主题分支时,我的主题分支中的相对提交的git-log 中的有用时间顺序就会丢失(也就是说,每个分支都变成一条长线,因为它的所有提交都重新设置为顺序且几乎相同的提交者时间戳。)

如果我可以让git-logauthor 时间戳而不是committer 时间戳对提交进行排序,这将得到解决。有谁知道这样做的方法吗?


对于那些从 Google 结果访问此内容的人,您可能需要查看下面的josephdpurcell 的解决方案(和in-depth blog post!)。如果您正在寻找标准的git-log 样式输出,多行,并且包含有关每次提交的详细消息,这非常棒。

不幸的是,我现在需要修改这个问题,因为我是个白痴,没有提供有关我的用例的更具体信息:我在“--graph 模式”中使用git-log,我需要使 git-log 本身 以作者日期顺序运行。据我所知,这在git-log 外部是完全不可能的,因为git-log 它自己 处理图形排序和打印。

看来,git-log 的脚本或补丁可能是必要的。在有人可以 1. 编写这样的脚本或 2. 我们可以说服 git 作者包含 --author --date-order 标志组合之前,我将保持开放状态。 (=


作为参考,以下是我当前的glog function 输出的样子,以及我需要重新排序的内容:

【问题讨论】:

【参考方案1】:

--date-order/--topo-order 实际上只是在您查看多个分支并排运行时控制修订列表中提交的顺序。 “x is-a-parent of 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

【讨论】:

【参考方案3】:

好的,我花了很长时间才弄清楚 (details)。简而言之,我发现了许多不完整或不正确的示例。以下命令执行我认为您所期望的操作:

$ 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 是的!简单而甜蜜。并为整个博客解释 +1。 如果你想把它变成别名:alias prettylog=git log --pretty='format:%at %C(yellow)commit %H%Creset\nAuthor: %an &lt;%ae&gt;\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" 我实际上是从你的解决方案中寻找一个前身(我正在设置一个单行日志;所以所有多行和tr nonesense 与我无关)......但既然你将你所有的研究浓缩成一篇博文(你这个狡猾的恶魔!),我能够使用你以前的一个化身。我从 S.O. 得到的最好的回应;希望我能两次投票给你。 (= 我对这个解决方案非常兴奋,直到我意识到它不支持--graph,这完全违背了我的目的。没有--graph,我看不到我的历史的结构,这使得git-log 对我整体来说毫无用处。 >:【参考方案4】:

git 版本 1.8.4 为 git log 添加了一个 --author-date-order 参数;根据release notes,“输出是拓扑排序的,并行历史中的提交根据作者时间戳显示混合在一起。”

【讨论】:

嘿。我实际上在这里做了很多工作(在发布这个问题之后),但没有意识到它已经被清理和主线。凉爽的!感谢您的提醒。我会测试它确实解决了我实际的原始问题,然后可能会接受这个答案。 我遇到了相同(或非常相似)的问题,将其添加到我的日志别名中使其现在更具可读性。谢谢!

以上是关于如何根据作者的时间戳制作 git log 顺序?的主要内容,如果未能解决你的问题,请参考以下文章

更改 Git/GitHub 存储库的作者姓名和电子邮件,为所有提交保留时间戳

如何根据时间戳匹配值,当时间戳不存在时,该值是前一个时间戳的值

Git如何保存预设的git log --format

android程序在logcat中不停地打印timeline时间戳

php error.log中的不同时间戳

推送时的 Git 本地提交时间戳