如何处理git仓库中广泛的代码格式变化

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

你可以把它看作漂亮打印和低级/机械重构之间的事情。

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

  • 有什么办法可以让这些变更对git blame等透明吗?所以在从一个月的时间开始看代码的时候,我们会看到引入逻辑的提交,而不是缩进或大小写更改的提交。
  • 从没有经过这个过程的叉子合并的最好方法是什么? 我现在的计划是有一个脚本克隆分叉的回购,应用自动化的过程,它的基地,差异化,然后应用差异。 但我很乐意有一个更清晰的答案。
  • 还有什么其他的问题我没有看到,如果有的话,可以采取什么措施来缓解呢? 我认为,git bisect等应该是罚款,gitlogin等跨越了巨大的鸿沟将烦人,除非你小心,git diff将是绝望的,但我不相信我不俯视另一个痛点。
  • 我不知道如何处理你所描述的一些更有侵略性的变化,但是…

    git blamegit diff和其他的-w选项会让git忽略空白的变化,所以你可以更容易地看到真正的差异。

    我会build议在Git的一个中央仓库中一次一步地完成这些演变(在所有其他仓库的公开参考中)。

    • 缩进
    • 然后重新sorting方法
    • 然后重命名
    • 然后 …

    但不是“压缩 – 重新sorting – 重命名 – 一个巨大的承诺”。

    这样,您可以给Git一个合理的机会来跟踪重构修改的变化。

    此外,我不会接受任何新的合并(从其他回购拉),其中没有应用相同的重构之前推他们的代码。
    如果应用格式化过程会对获取的代码进行任何更改,您可以拒绝它并要求远程回购首先符合新的标准(至less在再次推出之前从您的回购中拉出)。

    你还需要一个合并工具来允许忽略空白。 p4merge这样做,并可以免费下载。

    这个问题有一个很好的解决scheme。 简单的使用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可能会有所帮助,但我不知道。