是否可以进行不重写先前提交作者的提交?

Is it possible to make a commit that does not rewrite the previous commit author?

我知道这听起来很糟糕,但这是我的用例。

我们有一个很大的代码库,它总是带有一些愚蠢的合并冲突,比如额外的逗号或新格式。

我们想引入一个自动代码格式化程序来使整个项目之间保持一致,并让它运行为整个项目一次,然后在每次推送之前自动进行。

问题来了。如果可能的话,我们希望避免丢失关于谁在上一次提交中更改了什么的信息,因为这个大 "format commit" 将包含空格、换行符和可能的几个逗号。这可能吗?

当你提交时,你可以指定你想要的任何作者(甚至是提交者,虽然我认为这在这里并不重要)——这就是为什么这些值不能用于任何类型的敏感审计(这就是为什么GPG 签名是一回事)。我会稍微谈谈如何做,但随后我将解释为什么它可能是错误的解决方案。

声明作者是谁...这很容易。 git commit 有一个 --author 选项。 (参见 https://git-scm.com/docs/git-commit。)

git commit --author 'Bob <bob@company.com>'

因此您可以编写一个脚本来从上一次提交中获取该信息(请参阅 https://git-scm.com/docs/git-show 获取它的一种方法)。

但正如我所说,这可能是错误的解决方案。 首先想想你为什么要这样做...

从评论来看,您似乎担心 git blame 输出。

总的来说,为什么 blame 命名为 "the last person who committed before the format commit" 比命名为 'the id that ran the formatting' 更准确?假设您有来自 Alice、Bob 和 Charlie 的提交,然后是格式提交。

A -- B -- C -- F

现在也许 Alice 改变了 file-a.txt,Bob 改变了 file-b.txt,但即使 Charlie 只触及 file-c.txt,如果需要重新格式化 任何行的任何行在这些文件 中,该行似乎是由 Charlie 创作的。就我而言,这比拥有服务帐户 运行 格式和指责 "not know better".

更糟糕

您可以通过在每次 "real" 提交之后进行格式提交来改进...但是一旦您这样做...

因为你只影响前一个提交,你可以在提交格式化提交时使用 commit --amend;默认情况下,这不会更改原始提交的作者

BUT 这是一个(小的)历史重写,所以你真的想在受影响的提交被推送之前在本地进行。一旦你走了那么远......

为什么不直接设置挂钩,如果格式不正确就不会接受提交?你的服务器可以设置一个 post-receive hook 来检查这个,然后你的用户很可能会选择添加 commit hook,这样问题就可以立即解决,他们以后不必返回并修复它.