是否有可能在报告提交之前查看谁编辑了特定行git blame,例如给定行的提交历史记录?
例如,我运行以下(在极好的uncrustify项目上):
$ git blame -L10,+1 src/options.cpp
^fe25b6d (Ben Gardner 2009-10-17 13:13:55 -0500 10) #include "prototypes.h"
Run Code Online (Sandbox Code Playgroud)
如何在提交之前找出谁编辑了该行fe25b6d?又是谁之前编辑它是承诺?
当我在文件上运行git blame(使用msysgit)时,我总是得到以下类型的打印输出:
00000000 (Not Committed Yet 2011-01-09 11:21:30 +0200 1) package co
00000000 (Not Committed Yet 2011-01-09 11:21:30 +0200 2) {
00000000 (Not Committed Yet 2011-01-09 11:21:30 +0200 3) impor
00000000 (Not Committed Yet 2011-01-09 11:21:30 +0200 4) impor
00000000 (Not Committed Yet 2011-01-09 11:21:30 +0200 5) impor
00000000 (Not Committed Yet 2011-01-09 11:21:30 +0200 6) impor
00000000 (Not Committed Yet 2011-01-09 11:21:30 +0200 7) impor
Run Code Online (Sandbox Code Playgroud)
即它显示所有行都没有提交.
我在许多文件上尝试了这个,它有许多提交 - 总是相同的结果.我也试过使用相对/完整路径,但它似乎没有区别.
当我尝试使用TortoiseGit的责任时,它总是将每一行显示为在第一次提交时最后一次提交:

甚至想,正如我所说的,这些文件的历史实际上有数十次提交.
想法?
编辑 - 更多信息
我想看看谁为文件贡献了哪一行/更改.git-blame正是如此.那么SourceTree有一个git-blame视图?
我无法弄清楚如何使用它git blame来获取曾经触及给定范围的行的提交集.还有像类似的问题这一个,但接受的答案没有给我带来更进一步.
假设我的定义从第1000行开始foo.rb.它只有5行长,但改变这些行的提交数量是巨大的.如果我做
git blame foo.rb -L 1000,+5
Run Code Online (Sandbox Code Playgroud)
我引用了(最多)五个不同的提交来改变这些行,但我也对"它们后面的提交"感兴趣.
同样的,
git rev-list HEAD -- foo.rb | xargs git log --oneline
Run Code Online (Sandbox Code Playgroud)
几乎是我想要的,但我无法指定行范围 git rev-list
我可以传递一个标志来git blame获取曾触及这五行的提交列表,或者构建提取此类信息的脚本的最快方法是什么?让我们暂时忽略定义曾经多于或少于5行的可能性.
git log有一个很好的--format选项来指定如何格式化输出.
但git blame似乎没有相应的,虽然默认输出blame不是很人性化.我希望看到更少.
例如,而不是:
5600cab7 js/sidebar/VehicleGrid.js (Rene Saarsoo 2009-10-08 18:55:24 +0000 127) if (x > y) {
b5f1040c js/map/monitoring/VehicleGrid.js (Mihkel Muhkel 2010-05-31 07:20:13 +0000 128) return x;
Run Code Online (Sandbox Code Playgroud)
我想拥有:
5600cab7 Rene Saarsoo (1 year ago) 127: if (x > y) {
b5f1040c Mihkel Muhkel (5 months ago) 128: return x;
Run Code Online (Sandbox Code Playgroud)
我认为我可以编写一个脚本来解析输出,git blame --porcelain但是考虑到可怕的默认输出,blame我觉得有人在那里已经做了一些事情.
有任何想法吗?或者实现这样一个脚本的任何提示?
编辑:通过编写小脚本解决它.
$ pwd
/data/mdi2/classes
$ git blame -L22,+1 -- utils.js
99b7a802 mdi2/utils.js (user 2015-03-26 21:54:57 +0200 22) #comment
$ git blame -L22,+1 99b7a802^ -- utils.js
fatal: no such path mdi2/classes/utils.js in 99b7a802^
Run Code Online (Sandbox Code Playgroud)
您已经注意到,该文件位于该提交的不同目录中
$ git blame -L22,+1 99b7a802^ -- ../utils.js
c5105267 (user 2007-04-10 08:00:20 +0000 22) #comment 2
Run Code Online (Sandbox Code Playgroud)
尽管如此
The origin of lines is automatically followed across whole-file renames (currently there is no option to turn
the rename-following off)
Run Code Online (Sandbox Code Playgroud)
责备不遵循重命名.为什么?
更新:简答
git blame 按照重命名但不是 git blame COMMIT^ -- <filename>
但是,通过批量重命名和大量历史记录手动跟踪文件重命名太难了.我认为,必须修复此行为以静默跟随重命名 …
我正在研究一种新的基于编织的数据结构,用于存储版本控制历史记录.这无疑会引发一些宗教战争,当它出现时是否是正确的做事方式,但现在这不是我的问题.
我的问题与输出责任应该给予什么有关.当一行代码被添加,删除并多次合并到自身时,并不总是清楚哪些修订应该归咎于它.值得注意的是,这意味着当一段代码被删除时,它的所有记录都已消失,并且没有责任去除.我已经解决过这个问题的每个人都说过,努力做得更好根本就不值得.有时候人们会把删除部分之后的行更改为从删除部分时的实际修改版本.据推测,如果该部分在最后,那么最后一行就会改变它的责任,如果文件结束为空,那么责任确实会消失在以太中,因为实际上没有任何地方可以归咎于责备信息.由于各种技术原因,我不会使用这个hack,但是假设继续但是这个完全没有文档但事实上的标准实践将是无可争议的(但是随意点燃我并将其从你的系统中取出).
继续我的实际问题.通常对每一行都负责,你会看到它在历史中添加和删除的完整历史记录,并使用三向合并(或者,在纵横交错合并的情况下,随机废话)并基于这些之间的关系您根据其历史记录确定该行是否应该在那里,如果它不应该,那么您使用当前版本将其标记为新的.如果一条线出现在具有不同blame的多个祖先中,那么它会选择哪一个任意继承.同样,我认为继续这种完全无证但事实上的标准做法将是无可争议的.
我的新系统分歧的地方在于,不是根据整个历史的复杂计算对一个给定的行是否应该在当前修订中进行复杂的计算,而是简单地查看直接的祖先,如果该行是在任何一个他们选择任意一个继承责任.我在很大程度上是出于技术原因而做出这种改变(并且由于类似的技术原因和缺乏关心,完全有可能其他责任实现做同样的事情)但在考虑之后,我的一部分实际上更喜欢新的行为.比旧的更直观和可预测.每个人都在想什么?
使用Eclipse Indigo Service Release 2,使用EGit插件和JDK 1.7.我已经看到它应该支持责备注释,但我不能像我在Eclipse Wiki上看到的那样展示它.
这是它看起来如何,你看不到指针,但我是在垂直的棕色线上盘旋:

有谁知道如何扩展注释视图?
我正在寻找这个问题的解决方案的mercurial等价物:
简而言之,我正在查看添加了一行的mercurial提交,并且在当前版本中,此行不再存在,我想查找删除的时间和原因.
我正在研究由少数开发人员共享的项目,如何在android studio中了解开发人员的责任?任何捷径或任何想法?这将有助于我们了解代码责任.