如何在git存储库中处理广泛的代码格式更改
我们有一个大约500000行代码的项目,使用git进行管理,其中大部分都有好几年的历史。我们将进行一系列修改,使旧代码符合开发人员社区当前的标准和最佳实践,包括命名约定、异常处理、缩进等 你可以把它看作介于漂亮的打印和低级/机械重构之间的东西 这个过程可能涉及到代码库中几乎每一行代码(~85%),有些代码行可能需要进行多达五次的修改。所有的更改都是语义中立的如何在git存储库中处理广泛的代码格式更改,git,refactoring,indentation,pretty-print,Git,Refactoring,Indentation,Pretty Print,我们有一个大约500000行代码的项目,使用git进行管理,其中大部分都有好几年的历史。我们将进行一系列修改,使旧代码符合开发人员社区当前的标准和最佳实践,包括命名约定、异常处理、缩进等 你可以把它看作介于漂亮的打印和低级/机械重构之间的东西 这个过程可能涉及到代码库中几乎每一行代码(~85%),有些代码行可能需要进行多达五次的修改。所有的更改都是语义中立的 有没有办法让更改对git Dull等透明,这样一个月后查看代码时,我们会看到提交逻辑,而不是缩进或大写更改的代码? 从未经历此过程的分叉
使用
-w
选项来git dull
、git diff
,以及其他选项会导致git忽略空格中的更改,因此您可以更容易地看到真正的差异。我建议在一个中心git repo中一步一步地进行这些改进(中心,如“所有其他存储库遵循的公共参考”):
- 压痕
- 然后重新排序方法
- 然后重命名
- 然后
如果应用格式化过程会对获取的代码进行任何更改,您可以拒绝它,并要求远程回购首先符合新标准(至少在进一步推送之前从您的回购中退出).您还需要一个合并工具,该工具允许对空白进行快速忽略。p4merge可以做到这一点,并且可以免费下载。这是一个很好的解决方案。请简要使用
git filter branch
我自己用这个代码:
git过滤器分支--tree filter“git diff tree--name only--diff filter=AM-r--no commit id\$git|u commit|grep.*cpp\|.*h'| xargs./emacs script”HEAD
哪个/emacs script
是我使用emacs来更改代码样式的脚本,它只需在每个文件上调用缩进区域
如果没有从存储库中删除或删除任何文件,则此代码可以正常工作,在这种情况下,使用
--忽略不匹配可能会有所帮助,但我不确定。和-m
/-C
选项git diff
和git dull
使其遵循重命名和复制;在git dull
的情况下>此外,还可以跨文件移动和复制代码片段。我们也一直在这样做。至于不接受修补程序,除非它们根据转换后的代码进行重定,否则这不是一个切实可行的选择;在这样的更改中,“重定基”相当于手动重新键入大部分/全部更改(想一想,如果大多数线路都改变了,不可避免的合并将会如何进行)因此,我们考虑让他们自己运行重构工具,但既然这个过程可以自动化,为什么不让他们自己在接受补丁时运行它,而不是让他们学习它,并在贡献方面增加额外的障碍?@MarkusQ:我同意这个原则,但只是想确定一下:我不是在说强制性的“重新基础”“在客户端完成,只需在推送之前由客户端执行强制的“重新格式化”(通过重新应用相同的重新格式化并检查结果是否与收到的文件相同,在服务器端的钩子中检查重新格式化)。这将避免当这些客户获取中央公共回购变更并在其基础上重新确定其工作时出现许多合并冲突。可能是因为问题是关于git以及它将如何处理这些变更,而不一定是其他工具来帮助这项工作。git filter branch
在该答案中使用的将重写ole history可以假装代码从未违反当前标准和最佳实践。这意味着您需要“向后移植”对过去所有单个提交的改进,而不是只对当前状态重新格式化一次。