如何处理git仓库中广泛的代码格式变化
我们有一个大约有500,000行代码的项目,使用git进行pipe理,其中大部分是几年前的事情。 我们即将进行一系列修改,以使旧代码符合开发人员社区当前的标准和最佳实践,涉及命名约定,exception处理,缩进等等。
你可以把它看作漂亮打印和低级/机械重构之间的事情。
这个过程可能会触及代码库中的几乎每一行代码(〜85%),有些行会受到多达五次的修改。 所有这些修改都是为了语义上的中立。
我不知道如何处理你所描述的一些更有侵略性的变化,但是…
git blame
, git diff
和其他的-w
选项会让git忽略空白的变化,所以你可以更容易地看到真正的差异。
我会build议在Git的一个中央仓库中一次一步地完成这些演变(在所有其他仓库的公开参考中)。
- 缩进
- 然后重新sorting方法
- 然后重命名
- 然后 …
但不是“压缩 – 重新sorting – 重命名 – 一个巨大的承诺”。
这样,您可以给Git一个合理的机会来跟踪重构修改的变化。
此外,我不会接受任何新的合并(从其他回购拉),其中没有应用相同的重构之前推他们的代码。
如果应用格式化过程会对获取的代码进行任何更改,您可以拒绝它并要求远程回购首先符合新的标准(至less在再次推出之前从您的回购中拉出)。
你还需要一个合并工具来允许忽略空白。 p4merge这样做,并可以免费下载。
这个问题有一个很好的解决scheme。 简单的使用git filter-branch
。
我为自己使用这个代码:
git filter-branch --tree-filter "git diff-tree --name-only --diff-filter=AM -r --no-commit-id \$GIT_COMMIT | grep '.*cpp\|.*h' | xargs ./emacs-script" HEAD
哪个./emacs-script
是我用emacs写的改变代码风格的脚本,它只是简单地调用每个文件的indent-region
。
此代码工作正常,如果没有任何文件删除或从存储库中删除,在这种情况下使用--ignore-unmatch
可能会有所帮助,但我不知道。