是否有可能看到谁在git blame报告的提交之前编辑了特定的行,就像一个给定行的提交历史?

例如,我运行以下(在优秀的uncrustify项目上):

$ git blame -L10,+1 src/options.cpp
^fe25b6d (Ben Gardner 2009-10-17 13:13:55 -0500 10) #include "prototypes.h"

我如何才能找到谁在提交fe25b6d之前编辑了这一行?在提交之前是谁编辑的?


当前回答

我写了一个ublame python工具,它可以返回影响给定搜索词的文件提交的简单历史,你可以在þroject页面上找到更多信息。

其他回答

对于这个问题,一个非常独特的解决方案是使用git log,正如Andre在这里解释的那样:

git log -p -M——follow——stat——path/to/your/file

基于Will Shepard的回答,他的输出将包含没有更改的提交的重复行,因此您可以按照以下方式过滤这些行(使用这个答案)

LINE=1 FILE=a; for commit in $(git rev-list HEAD $FILE); do git blame -n -L$LINE,+1 $commit -- $FILE; done | sed '$!N; /^\(.*\)\n\1$/!P; D'

注意,我删除了REVS参数,这将返回到根提交。这是由于Max Nanasy上面的观察。

如果你正在使用JetBrains Idea IDE(和衍生品),你可以选择几行,右键单击上下文菜单,然后Git ->显示历史选择。你将看到影响选定行的提交列表:

基于DavidN的回答,我想遵循重命名的文件:

LINE=8 FILE=Info.plist; for commit in $(git log --format='%h%%' --name-only --follow -- $FILE | xargs echo | perl -pe 's/\%\s/,/g'); do hash=$(echo $commit | cut -f1 -d ','); fileMayRenamed=$(echo $commit | cut -f2 -d ','); git blame -n -L$LINE,+1 $hash -- $fileMayRenamed; done | sed '$!N; /^\(.*\)\n\1$/!P; D'

参考:很好地显示文件重命名历史在git日志

安布尔的回答是正确的,但我觉得不清楚;语法为:

git blame {commit_id} -- {path/to/file}

注意:——用于将树状sha1与相对文件路径分开。1

例如:

git blame master -- index.html

这一切都要归功于安布尔!:)