git:在不改变所有权/责任的情况下改变样式(空白)?

git:在不改变所有权/责任的情况下改变样式(空白)?,git,standards,removing-whitespace,Git,Standards,Removing Whitespace,我们有一个庞大的、古老的代码库,需要大量清理。我们一直都有编码标准,每个人都一直试图遵循它们,但它们并没有得到强制执行,所以随着时间的推移,许多违规行为已经悄然出现。其中许多只是空白问题,比如使用制表符而不是空格,或者不应该有空格的空格,或者应该有空格的地方缺少空格。我们将开始积极实施我们的编码标准,以确保不会出现更多的违规行为,但很难仅对更改自动实施这些标准,因此清理这些旧文件会很好 有一些工具可以自动修复这些问题,但是如果我这样做,那么责怪将显示我是这些行的所有者,而实际上我可能从未见过它们

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

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

在一个理想的世界里,会有某种方式来改写历史,使其看起来似乎从未出现过违规行为

git过滤器分支
正是这样做的


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

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

git blame -w app/to/file.rb
或者您可以只使用git slap命令

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

具有相同的结果:D

我对执行了一个拉取请求,以在默认情况下为“浏览已注释的文件(责怪)”命令设置此“-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 
diff--git a/Support/lib/git.rb b/Support/lib/git.rb
索引5e8de13..5192953 100644
---a/Support/lib/git.rb
+++b/Support/lib/git.rb
@@-307,6+307,9@@模块SCM
文件=生成本地路径(文件路径)
args=[文件]
args在此基础上,我建议将
git-shame
作为一个全局git别名:

git config --global alias.shame 'blame -w -M'
…并使用它而不是git责怪:

git shame path/to/file
解释:
-
-w
忽略空格更改,因此不要责怪重新缩进代码的人

-
-M
检测移动或复制的行,并将使用JetBrains IDE中的VCS注释功能的人归咎于原始作者要查看
git-gull
输出,可以设置
-w
(忽略空白)、
-M
(检测文件中移动或复制的行)和
-C
(检测跨文件移动或复制的行)标志,如下所示:

配置注释选项
  • 在注释栏上单击鼠标右键,然后从关联菜单中选择“选项”

来源:

重写历史记录有点尴尬-一旦您更改了提交,其他人将不得不接受这些更改。不是理想工作流程的一部分。您可能希望研究如何使用钩子强制执行您的编码标准。当推送到中央回购协议时,您可以使用更新钩子来执行最终强制,您可以给开发人员一个预提交钩子来为他们执行相同的验证,甚至在安全的情况下自动修复。(如果你想修复已经存在的东西,我只需一次提交就可以了——不需要再经历重写整个历史的头痛。)可能的重复我不认为这完全是这个问题的重复。在我的问题中,我特别指出,改变指责的旗帜是不够的,而对这个问题的公认答案正是如此。谢谢,现在就开始调查这个问题!开始工作了
git filter branch--tree filter'git diff tree--name only--diff filter=AM-r--no commit id$git_commit | php cleanup.php'HEAD
your cleanup.php的外观如何?如果我的空白清除不能由脚本完成怎么办?(例如,空格缩进的使用不一致。)@ErikAllik我不确定你的意思,但在使用
git slap
之前的一行,它被定义为
git-w
的别名。-w空白参数的缺点之一是它考虑了重构方法顺序、删除松散注释、,还有更多的事情。