代码之家  ›  专栏  ›  技术社区  ›  MarkusQ

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

  •  42
  • MarkusQ  · 技术社区  · 16 年前

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

    你可以把它看作介于漂亮的打印和低级/机械重构之间的东西。

    这个过程可能涉及到代码库中几乎每一行代码(~85%),有些代码行可能需要进行多达五次的修改。所有的更改都是语义中立的。

  • 从未经历此过程的分叉中提取合并的最佳方法是什么?我目前的计划是让一个脚本克隆分叉回购协议,对其及其基础应用自动化流程,区分它们,然后应用差异。但我希望有一个更清晰的答案。
  • 有没有其他我没有看到的此类问题,如果有,可以做些什么来缓解它们?我认为git二分法等应该是好的,git log等。除非你小心,否则跨越大分水岭会很烦人,git diff将是无望的,但我不相信我没有忽略另一个痛点。
  • 4 回复  |  直到 16 年前
        1
  •  27
  •   Phil    16 年前

    我不知道如何最好地应对你所描述的一些更具侵入性的变化,但是。。。

    这个 -w 选择 git blame git diff

        2
  •  13
  •   VonC    16 年前

    我建议在中心Git回购中一步一个脚印地进行这些改进(中心如“所有其他存储库遵循的公共参考”):

    • 压痕
    • 然后重新排序方法
    • 然后重命名
    • 然后

    但不是“缩进-重新排序-重命名-一个巨大的提交”。

    另外,我不会接受任何新的合并(从其他回购协议中提取),这些合并在推送代码之前没有应用相同的重构。
    如果应用格式化过程会对获取的代码进行任何更改,您可以拒绝它,并要求远程回购首先符合新标准(至少在进一步推送之前从您的回购中退出)。

        3
  •  10
  •   krosenvold    16 年前

    您还需要一个合并工具,该工具允许对空白进行强制忽略。p4merge可以做到这一点,并且可以免费下载。

        4
  •  0
  •   Community Mohan Dere    8 年前

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

    推荐文章