一次性获取给定文件的完整责备历史记录

Getting full blame history all at once for a given file

提问人:Jason C 提问时间:12/10/2022 最后编辑:Jason C 更新时间:12/11/2022 访问量:114

问:

我正在开发一个程序,该程序可以分析一段时间内的 git blame 历史记录,从给定文件的第一次提交开始,一直到 HEAD,沿着给定的分支。

目前,我的做法是:

  1. 用于获取分支上每个提交的列表。git log --pretty='%H %ad' --date=unix <branch>
  2. 对于该列表中的每个提交,分别使用和分析结果。git blame --date=unix --minimal -l -e -w <commit> <filename>

问题是这需要很长时间。另外,我实际上是在多个存储库中对存储库中的每个文件执行此操作。因此,对于给定的 repo 来说,最坏的情况是我认为它类似于 O(number_of_files * number_of_commits)。大量时间被生成过程占用。对于一个只有几十个文件和几百个提交的小型存储库,它需要将近 3 分钟(运行大约 16,000 次),并且它已经完全并行化。gitgit

我的问题是,有没有办法在单个命令中获取对给定文件(虽然一次仍然是一个文件)的每次更改的完整责备历史记录(例如,如果一行在多次提交中多次更改),这样我就可以减少这花费的时间?我想将其减少到 O(number_of_files)。这是我的第一个优化目标,我只是还没有弄清楚是否有办法做到这一点。git

我查看了输出,但是,除非我误读了(我没有做适当的比较,所以我在这里可能是错的),它仍然只归咎于最近的变化,而不是一次发生所有变化。git blame --incremental

是否有可能这样做,如果可以,如何做?

git 与语言无关 git-blame

评论

1赞 eftshift0 12/10/2022
首先,有时 git 不是正确的答案。考虑改用 libgit2(这样可以避免一个又一个的进程生成)。其次,我想知道你为什么要责怪每次提交。我需要尝试自己来正确处理所有细节,在我看来,您应该为每个提交获得针对父级的差异(在处理每个提交时,旧提交对文件所做的操作应该显示出来)。再说一遍:也许我错过了一些东西(比如:你如何处理非线性历史?
1赞 eftshift0 12/10/2022
我认为尝试处理类似的东西应该很有趣:这样你就可以在一个镜头中获得所有更改......也许更多的选项会让它更容易解析......我想知道是否可以让您看到非线性历史的祖先(就此文件而言)。git log --graph --patch -- the-file--graph
0赞 Lazy Badger 12/10/2022
"...分析一段时间内 git blame 历史记录的程序,从给定文件的第一次提交开始,一直到 HEAD,沿着给定的分支......”1. 请解释 - 为什么?我无法想象这项任务有任何合理有用的业务目标 2.如果你只想对“给定的分支”进行提交,uou 至少要使用 3。a) 对向行走历史的责备略多于完全无用 - 它包含的信息比日志少 b) 对向后行走历史的责备是日志的重复(不是输出格式,而是信息),与日志相比可能存在差距git log <given branch>
0赞 Lazy Badger 12/10/2022
@eftshift0 - 绝对*不是“更容易解析”git log --graph
1赞 torek 12/10/2022
这绝对是一个难题,这也是 Git 还没有解决它的原因之一。

答: 暂无答案