Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在git存储库中处理广泛的代码格式更改_Git_Refactoring_Indentation_Pretty Print - Fatal编程技术网

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

如何在git存储库中处理广泛的代码格式更改,git,refactoring,indentation,pretty-print,Git,Refactoring,Indentation,Pretty Print,我们有一个大约500000行代码的项目,使用git进行管理,其中大部分都有好几年的历史。我们将进行一系列修改,使旧代码符合开发人员社区当前的标准和最佳实践,包括命名约定、异常处理、缩进等 你可以把它看作介于漂亮的打印和低级/机械重构之间的东西 这个过程可能涉及到代码库中几乎每一行代码(~85%),有些代码行可能需要进行多达五次的修改。所有的更改都是语义中立的 有没有办法让更改对git Dull等透明,这样一个月后查看代码时,我们会看到提交逻辑,而不是缩进或大写更改的代码? 从未经历此过程的分叉

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

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

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

  • 有没有办法让更改对git Dull等透明,这样一个月后查看代码时,我们会看到提交逻辑,而不是缩进或大写更改的代码?
  • 从未经历此过程的分叉中提取合并的最佳方法是什么?我目前的计划是让一个脚本克隆分叉回购协议,对其及其基础应用自动化流程,区分它们,然后应用差异。但我希望有一个更清晰的答案。
  • 有没有其他我没有看到的此类问题,如果有,可以做些什么来缓解它们?我认为git二分法等应该很好,git log等。除非你小心,否则跨越巨大的鸿沟会很烦人,git diff将是无望的,但我不相信我没有忽略另一个痛点。

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


    使用
    -w
    选项来
    git dull
    git diff
    ,以及其他选项会导致git忽略空格中的更改,因此您可以更容易地看到真正的差异。

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

    • 压痕
    • 然后重新排序方法
    • 然后重命名
    • 然后
    但不是“缩进-重新排序-重命名-一个巨大的提交”

    这样,Git就有了一个合理的机会,可以在重构修改过程中跟踪更改

    另外,我不会接受任何新的合并(从其他回购协议中提取),这些合并在推送代码之前没有应用相同的重构。

    如果应用格式化过程会对获取的代码进行任何更改,您可以拒绝它,并要求远程回购首先符合新标准(至少在进一步推送之前从您的回购中退出).

    您还需要一个合并工具,该工具允许对空白进行快速忽略。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可以假装代码从未违反当前标准和最佳实践。这意味着您需要“向后移植”对过去所有单个提交的改进,而不是只对当前状态重新格式化一次。