2010-11-06 49 views
34

我们有一个庞大而古老的代码库,需要大量的清理工作。我们一直都有编码标准,每个人都一直试图遵循它们,但是它们并没有被执行,所以随着时间的推移,很多违规行为已经蔓延开来。其中许多只是空白问题,例如使用制表符而不是空格或空格不应该有任何或应该是空位。我们将开始积极执行我们的编码标准,以确保更多的违规行为不会蔓延,但仅仅在变化时以自动方式强制执行它们是很困难的,所以清理这些旧文件会很好。git:改变造型(空白)而不改变所有权/责怪?

有些工具可以自动解决这些问题,但是如果我这样做,那么责备就会让我看到这些线的所有者,实际上我可能永远都看不到它们。我知道有一种设置可以忽略空白变化,但我不能让每个人都以同样的方式使用责任,包括其他视觉工具和gitstats之类的东西。在一个理想的世界里,会有一些方法来重写历史,看起来没有引入违规,没有掩盖谁介绍了实际的代码,但我找不到这样的事情。

+4

重写历史记录有点尴尬 - 一旦你改变了提交,其他人将不得不提取这些改变。不属于理想的工作流程。您可能想要考虑使用挂钩来强制执行编码标准。您可以使用更新挂钩在推送到中央仓库时执行最终实施,并且可以为开发人员提供预先提交挂钩以对它们执行相同的验证,并且如果安全的话可以自动修复。 (如果你想解决已经存在的问题,我只需要做一次提交 - 不需要经历重写整个历史的头痛问题。) – Cascabel 2010-11-06 08:29:45

+3

可能的重复[Git commit不覆盖原作者git责备](http://stackoverflow.com/questions/3945382/git-commit-that-doesnt-override-original-authors-in-git-blame) – 2010-11-06 08:36:08

+3

我不认为这是完全重复的问题。在我的问题中,我特别指出,责怪改变旗帜是不够的,对这个问题的接受答案就是这样。 – 2010-11-07 06:54:55

回答

17

在一个理想的世界会有一些方法来改写历史,看起来像违法行为却从未实行

git filter-branch不正是。

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

这有相同的问题,因为所有的历史改写的命令去做,因为它本质上会使所有克隆库。

+0

谢谢,现在看着这个! – 2010-11-06 17:55:40

+6

得到它的工作! 'git filter-branch --tree-filter'git diff-tree --name-only --diff-filter = AM -r --no-commit-id $ GIT_COMMIT | php cleanup.php'HEAD' – 2010-11-07 22:30:40

+9

你的cleanup.php是怎么样的? – Cybot 2013-07-03 09:21:17

35

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

git blame -w app/to/file.rb 

,或者你也可以只使用,混帐巴掌命令..

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

具有相同的结果:d

+1

这个'git slap'命令来自哪里? – 2014-01-11 16:14:00

+5

@ErikAllik我不确定你的意思,但是在使用'git slap'之前的一行,它被定义为'git blame -w'的别名。 – blinry 2014-08-08 17:52:54

+0

-w空格参数的一个缺点是它确实考虑了重构方法的顺序,删除松散注释等等。 – JosephMCasey 2016-11-18 20:38:52

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 
2

大厦Mario's answer,我建议git shame作为一个全球性的git-别名:

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

...并用它代替混帐怪:

git shame path/to/file 

要解释:
- -w忽略空白的变化,所以不要责怪重新缩进代码的人
- -M检测被移动或复制的行,并责怪原作者