43

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

有一些工具可以自动修复这些问题,但是如果我这样做了,那么责备将显示我是这些行的所有者,而实际上我可能从未见过它们。我知道有一个设置可以让责备忽略空白更改,但我不能让每个人都以相同的方式使用责备,包括其他可视化工具和 gitstats 之类的东西。在一个理想的世界中,有某种方法可以重写历史,看起来从未引入过违规行为,而不掩盖是谁引入了实际代码,但我找不到类似的东西。

4

5 回答 5

36

如果您尝试使用责备来解决根本原因问题,请不要忘记使用该-w标志来忽略所有空格或缩进更改。因此,您将获得对代码的最后一次真正更改,而不是缩进或删除尾随空格。

git blame -w app/to/file.rb

或者你可以使用 git slap 命令..

git config alias.slap "blame -w";
git slap app/path/to/file.rb

有相同的结果:D

于 2010-11-22T19:47:45.963 回答
22

在一个理想的世界里,会有某种方式来改写历史,看起来好像从未引入过违规行为

git filter-branch正是这样做的。

http://git-scm.com/docs/git-filter-branch

这与所有历史重写命令具有相同的问题,因为它基本上使所有克隆的存储库无效。

于 2010-11-06T08:17:31.547 回答
12

基于马里奥的回答,我建议git shame作为全球 git 别名:

git config --global alias.shame 'blame -w -M'

...并使用它代替 git-blame:

git shame path/to/file

解释:

  • -w忽略空格更改,因此不要责怪重新缩进代码的人
  • -M检测被移动或复制的行,并指责原作者

编辑:

一些人认为这-M是误导,责怪错误的人
(即:如果有人重新安排了我写的内容,请不要责怪我)。
如果你有同样的感觉,请使用原来的建议:git slap

于 2017-06-29T14:03:09.963 回答
1

我对TextMate git Bundle做了一个拉取请求,默认情况下为“浏览注释文件(责备)”命令设置此“-w”参数。谢谢马里奥·扎扎尔,你让我开心。

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 
于 2010-12-17T13:01:31.877 回答
-1

对于那些使用 JetBrains IDE 中的VCS 注释功能来查看git blame输出的用户,您可以设置-w(忽略空格)、-M(检测文件中移动或复制的行)和-C(检测跨文件移动或复制的行)标志,如下所示:

配置注释选项</h3>
  • 右键单击注释装订线并从上下文菜单中选择选项

资料来源:IntelliJ 文档

于 2020-01-25T09:47:04.460 回答