我们有一个庞大而古老的代码库,需要大量的清理工作。我们一直都有编码标准,每个人都一直试图遵循这些标准,但是它们没有得到强制执行,因此随着时间的推移,很多违规行为都被侵入。其中许多只是空白问题,比如使用制表符而不是空格,或者是那里的空格不应该是任何或缺少的空间。我们将开始积极执行我们的编码标准,以确保更多违规行为不会蔓延,但很难以自动方式仅对更改强制执行,因此清理这些旧文件会很好。
有些工具可以自动解决这些问题,但是如果我这样做,那么责备就会把我看作是这些线路的拥有者,而实际上我可能从来没有见过它们。我知道有一个设置可以归咎于忽略空格的变化,但我不能让每个人都以同样的方式使用责任,包括其他可视化工具和gitstats之类的东西。在一个理想的世界中,有一些方法可以重写历史,看起来像是从未引入过违规,而没有掩盖谁介绍了实际的代码,但我找不到类似的东西。
答案 0 :(得分:36)
如果您尝试使用blame获取根本原因问题,请不要忘记使用-w
标志忽略所有空格或缩进更改。因此,您将获得代码的最后一次真正更改,而不仅仅是缩进,或删除尾随空格。
git blame -w app/to/file.rb
或者你可以使用,git slap命令..
git config alias.slap "blame -w";
git slap app/path/to/file.rb
具有相同的结果:D
答案 1 :(得分:20)
在一个理想的世界中,有一些方法可以重写历史,看起来像是从未引入过违规行为
git filter-branch
正是这样做的。
http://git-scm.com/docs/git-filter-branch
这与所有历史重写命令都有相同的问题,因为它基本上使所有克隆的存储库无效。
答案 2 :(得分:7)
在Mario's answer的基础上,我建议git shame
作为全球git-alias:
git config --global alias.shame 'blame -w -M'
...并使用它代替git-blame:
git shame path/to/file
解释:
- -w
忽略空格更改,因此不要责怪重新缩进代码的人
- -M
检测已移动或复制的行,并归咎于原作者
答案 3 :(得分:1)
我向TextMate git Bundle发出拉取请求,默认情况下为“浏览附加文件(责备)”命令设置此“-w”参数。谢谢Mario Zaizar,你结识了我的一天。
diff --git a/Support/lib/git.rb b/Support/lib/git.rb
index 5e8de13..5192953 100644
--- a/Support/lib/git.rb
+++ b/Support/lib/git.rb
@@ -307,6 +307,9 @@ module SCM
file = make_local_path(file_path)
args = [file]
args << revision unless revision.nil? || revision.empty?
+ # Ignore whitespace when comparing the parent's version and
+ # the child's to find where the lines came from.
+ args << '-w'
output = command("annotate", *args)
if output.match(/^fatal:/)
puts output
答案 4 :(得分:-1)
对于在JetBrains IDE中使用 VCS注释功能的用户,可以看到git blame
的输出,可以设置-w
(忽略空格),-M
(检测文件中移动或复制的行)和-C
(检测文件中移动或复制的行)标志,如下所示:
配置注释选项
- 右键单击注释装订线,然后从上下文菜单中选择选项