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