Clang格式的完整代码保存git历史



我有一个项目有来自多个用户的丰富的git历史记录,它从未被自动格式化,我想在它上运行clang格式。保留git历史很重要。

我的意思的一些例子。

当有一个来自Joe的代码块,然后"a+b"被转换为a + b时。它在git blame中保持乔的路线。

当出现时

void foo()
{
return k;
}

并将其格式化为

void foo() { return k; }

它仍然是乔的密码。

等等。

有已知的解决方案吗?

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

1) 原则上,您可以通过一个接一个地回放所有提交并应用自动格式来重新创建存储库,但这个新的存储库将是不同的:所有提交的SHA都将不同。一些冲突是可能的,特别是在非线性历史(合并)的情况下。这可能不是一个琐碎且完全自动的操作。

2) 您也可以将格式化作为新的提交(单个、巨大的提交)来应用,但这将使git blame的使用更加困难。

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

"保存历史"有两个方面,这两个方面都可以用git:来完成

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

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

最后一个选项是在提交代码时修复代码。这会导致单个文件中的样式混乱不堪,而且毫无帮助。

最新更新