如何在git存储库中处理广泛的代码格式更改

时间:2009-12-01 06:30:17

标签: git refactoring indentation pretty-print

我们有一个包含大约500,000行代码的项目,使用git进行管理,其中大部分是几年。我们即将进行一系列修改,以使旧代码符合开发人员社区的当前标准和最佳实践,包括命名约定,异常处理,缩进等。

你可以把它想象成漂亮的印刷和低级/机械重构之间的东西。

这个过程几乎可以触及代码库中的每一行代码(~85%),有些行可能会受到多达五次修改。所有这些更改都是在语义上保持中立。

  • 有没有办法让改变对git blame等透明化,这样当从一个月后查看代码时,我们会看到引入逻辑的提交,而不是其中的缩进或大写是否改变了?
  • 从未经历此流程的分支中提取合并的最佳方法是什么?我现在的计划是让一个脚本克隆分叉的repo,将自动化过程应用于它及其基础,对它们进行区分,然后应用diff。但我希望得到更清晰的答案。
  • 还有其他我没有看到的问题,如果有的话可以采取哪些措施来缓解这些问题?我认为git bisect等应该没问题,git log等等。除非你小心谨慎,否则git diff会很烦人,但是我不相信我不会忽视另一个痛点。

  • 4 个答案:

    答案 0 :(得分:23)

    我不知道如何最好地处理你所描述的一些更具侵略性的变化,但是......

    -wgit 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的情况可能会有所帮助,但我不确定。