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

保存git历史记录的Clang格式完整代码[重复]

  •  0
  • Yuki  · 技术社区  · 6 年前

    我有一个项目有着丰富的git历史,来自多个用户,它从来没有自动格式化过,我想在它上运行clang format。保存git历史很重要。

    我的意思的一些例子。

    当有一段来自Joe的代码,然后“a+b”被转换为 a + b .它保持着乔的路线 git blame .

    当有

    void foo()
    {
        return k;
    }
    

    它被格式化为

    void foo() { return k; }
    

    它仍然是乔的密码。

    有什么已知的解决方案吗?

    2 回复  |  直到 6 年前
        1
  •  0
  •   Krzysiek Karbowiak    6 年前

    基本上,你不能两全其美(也就是说,保存历史和自动格式化),但你有一些选择。

    1) 原则上,您可以通过应用自动格式逐个重放所有提交来重新创建存储库,但这个新存储库将是一个不同的存储库:所有提交都将是不同的。有些冲突是可能的,尤其是在非线性历史(合并)的情况下。这可能不是一个微不足道的、完全自动的操作。

    2) 您也可以将格式作为一个新的提交(单个、巨大的提交)应用,但这将使使用 git blame 更努力。

    3) 当文件在开发过程中被修改时,您也可以在移动中应用自动格式化。这将产生较小的影响,但也不是完美的。

        2
  •  0
  •   rubenvb    6 年前

    “保存历史”有两个方面,这两个方面都可以通过git实现:

    1. 在现有历史的基础上进行更改:只需提交一次格式更改,就会给git带来负担。这很简单,与您的正常工作流程没有什么不同。我建议只进行一次提交,然后在服务器端和客户端将格式化作为预合并和预提交挂钩。

    2. 重写所有历史记录,分别格式化每个提交。这使得对提交等的重写前散列的任何引用都无效,但会给您一个干净的git/log。这需要使用一些魔法(可能是低级的)git命令来实现。或者是一个“简单”的“交互式”重基,在这里,您可以通过格式更改修改每个提交(尽管保留原始提交者可能会带来一些额外的魔力)。

    最后一个选项是在提交代码时修复代码。这会导致单个文件中的样式出现可怕的混乱,对任何事情都没有帮助。