我们有一个包含大约500,000行代码的项目,使用git进行管理,其中大部分是几年。我们即将进行一系列修改,以使旧代码符合开发人员社区的当前标准和最佳实践,包括命名约定,异常处理,缩进等。
你可以把它想象成漂亮的印刷和低级/机械重构之间的东西。
这个过程几乎可以触及代码库中的每一行代码(~85%),有些行可能会受到多达五次修改。所有这些更改都是在语义上保持中立。
答案 0 :(得分:23)
我不知道如何最好地处理你所描述的一些更具侵略性的变化,但是......
-w
,git blame
及其他人的git diff
选项会导致git忽略空格中的更改,因此您可以更轻松地查看真正的差异。
答案 1 :(得分:11)
我建议将这些演变一步一步地放在一个中央的Git仓库中(如“所有其他储存库的公共参考”中心):
但不是“缩进 - 重新排序 - 重命名-...-一个巨大的提交”。
这样,你就给Git一个合理的机会来跟踪重构修改后的变化。
另外,我不接受在推送代码之前没有应用相同重构的任何新合并(从其他仓库中提取)。
如果应用格式化过程会对获取的代码进行任何更改,您可以拒绝它并要求远程仓库首先符合新标准(至少在再次推送之前从您的仓库中提取)。
答案 2 :(得分:9)
您还需要一个允许对空白进行大量忽略的合并工具。 p4merge这样做,可以免费下载。
答案 3 :(得分:0)
这个question有一个很好的解决方案。简要使用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
的情况可能会有所帮助,但我不确定。