Git怪 – 之前的承诺?
我喜欢git blame
命令,这对于追踪那些不需要编写代码的人来说非常有用。 🙂
然而, 在 git blame
所提交的提交之前 ,是否可以看到谁编辑了特定的行,例如提交给定行的提交历史logging?
例如,我运行以下(在超级uncrustify
项目):
$ git blame -L10,+1 src/options.cpp ^fe25b6d (Ben Gardner 2009-10-17 13:13:55 -0500 10) #include "prototypes.h"
如何在提交fe25b6d
之前找出谁编辑了该行? 谁是在提交之前编辑它的? 我相信这是可能的,但我的git-fu很弱。
git blame -L10,+1 fe25b6d^ -- src/options.cpp
你可以指定一个修改混帐责备回头看(而不是默认的HEAD
); fe25b6d^
是fe25b6d^
的父fe25b6d
。
您可以使用git log -L来查看一系列行的演变。
例如 :
git log -L 15,23:filename.txt
意思是“跟踪名为filename.txt的文件中15到23行的演变”。
build立在以前的答案,这个bash单线程应该给你你想要的。 它通过最近的5个修订版显示了特定文件的特定行的git blame历史logging:
LINE=10 FILE=src/options.cpp REVS=5; for commit in $(git rev-list -n $REVS HEAD $FILE); do git blame -n -L$LINE,+1 $commit -- $FILE; done
在此命令的输出中,对于特定的提交,您可能会看到换行的内容,或显示的行号甚至可能会改变。
这通常表明该行是在特定的提交之后首次添加的。 它也可能表示该行已从文件的另一部分移出。
琥珀的答案是正确的,但我发现它不清楚; 语法是:
git blame {sha1} -- {path/to/file}
注意: --
用于将tree-ish sha1与相对文件path分开。 1
例如:
git blame master -- index.html
充分相信琥珀知道所有的事情! 🙂
还有recursive-blame
。 它可以安装
npm install -g recursive-blame
这个问题的一个非常独特的解决scheme是使用git log:
git log -p -M – follow –stat – path / to / your / file
正如Andre 在这里解释的那样
你可能想看看:
git gui blame <filename>
给你一个不错的graphics显示,像“git blame”这样的变化,但每行都有可点击的链接,以便移动到更早的提交中。 将鼠标hover在链接上以获取提交详细信息的popup窗口。 不是我的信用…在这里find它:
build立在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的观察。
build立在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'
ref: 在git log中很好地显示文件重命名历史logging
我用这个小bash脚本来看看一个怪的历史。
第一个参数:要查看的文件
后续参数:通过git责备
#!/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这样的blame参数,但是最好用正则expression式来searchgit blame,因为行号通常会随着时间的推移而“变化”。
build立在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 }