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

Jay*_*ine 41 git standards removing-whitespace

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

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

小智 36

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

git blame -w app/to/file.rb
Run Code Online (Sandbox Code Playgroud)

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

git config alias.slap "blame -w";
git slap app/path/to/file.rb
Run Code Online (Sandbox Code Playgroud)

结果相同:D

  • @ErikAllik我不确定你的意思,但在使用`git slap`之前的一行,它被定义为`git blame -w`的别名. (5认同)
  • -w 空白参数的缺点之一是它确实考虑了重构方法的顺序、删除松散的注释等等。 (2认同)

wno*_*ise 20

在一个理想的世界中,有一些方法可以重写历史,看起来从未引入过违规行为

git filter-branch 确切地说.

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

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

  • 你的cleanup.php怎么样? (11认同)
  • 搞定了!`git filter-branch --tree-filter'git diff-tree --name-only --diff-filter = AM -r --no-commit-id $ GIT_COMMIT | php cleanup.php'HEAD` (7认同)

Gon*_*nen 9

基于马里奥的回答,我建议git shame作为一个全球性的git-alias:

git config --global alias.shame 'blame -w -M'
Run Code Online (Sandbox Code Playgroud)

...并使用它而不是git-blame:

git shame path/to/file
Run Code Online (Sandbox Code Playgroud)

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