是否有可能看到谁在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之前编辑了这一行?在提交之前是谁编辑的?


当前回答

基于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日志

其他回答

我使用这个小bash脚本查看一个指责历史。

第一个参数:要查看的文件

后续参数:传递给git blame

#!/bin/bash
f=$1
shift
{ git log --pretty=format:%H -- "$f"; echo; } | {
  while read hash; do
    echo "--- $hash"
    git blame $@ $hash -- "$f" | sed 's/^/  /'
  done
}

你可以提供像-L 70,+10这样的责备参数,但最好使用git责备的正则表达式搜索,因为行号通常会随着时间的推移而“改变”。

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

基于stangls的答案,我把这个脚本放在我的PATH(甚至在Windows上)作为git-bh:

这允许我查找所有涉及到一个词的提交:

git bh path/to/myfile myWord

脚本:

#!/bin/bash
f=$1
shift
csha=""
{ git log --pretty=format:%H -- "$f"; echo; } | {
  while read hash; do
    res=$(git blame -L"/$1/",+1 $hash -- "$f" 2>/dev/null | sed 's/^/  /')
    sha=${res%% (*}
    if [[ "${res}" != "" && "${csha}" != "${sha}" ]]; then
      echo "--- ${hash}"
      echo "${res}"
      csha="${sha}"
    fi
  done
}

基于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 2.23开始,你可以使用Git blame——ignore-rev

对于问题中给出的例子,这将是:

git blame -L10,+1 src/options.cpp --ignore-rev fe25b6d

(然而,这是一个棘手的问题,因为fe25b6d是该文件的第一个修订!)