git:改变样式(空白)而不改变所有权/责备?

时间:2010-11-06 08:12:15

标签: git standards removing-whitespace

我们有一个庞大而古老的代码库,需要大量的清理工作。我们一直都有编码标准,每个人都一直试图遵循这些标准,但是它们没有得到强制执行,因此随着时间的推移,很多违规行为都被侵入。其中许多只是空白问题,比如使用制表符而不是空格,或者是那里的空格不应该是任何或缺少的空间。我们将开始积极执行我们的编码标准,以确保更多违规行为不会蔓延,但很难以自动方式仅对更改强制执行,因此清理这些旧文件会很好。

有些工具可以自动解决这些问题,但是如果我这样做,那么责备就会把我看作是这些线路的拥有者,而实际上我可能从来没有见过它们。我知道有一个设置可以归咎于忽略空格的变化,但我不能让每个人都以同样的方式使用责任,包括其他可视化工具和gitstats之类的东西。在一个理想的世界中,有一些方法可以重写历史,看起来像是从未引入过违规,而没有掩盖谁介绍了实际的代码,但我找不到类似的东西。

5 个答案:

答案 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(检测文件中移动或复制的行)标志,如下所示:

配置注释选项

  • 右键单击注释装订线,然后从上下文菜单中选择选项

来源:IntelliJ docs