【问题标题】:Is it possible to make a commit that does not rewrite the previous commit author?是否可以进行不重写先前提交作者的提交?
【发布时间】:2019-12-27 10:23:37
【问题描述】:

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

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

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

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

【问题讨论】:

  • 为什么添加新提交会丢失旧提交中的信息?
  • @melpomene 使用 git blame 将在大多数 IDE 中显示每行最后一次修订的作者(责备)
  • 是的,出于这个原因,我从不使用git blame。它只向您显示最后一次触及一行的提交。 git log -p --follow FILE 更有用。
  • 也就是说,试试git blame -w

标签: git git-blame


【解决方案1】:

当你提交时,你可以指定你想要的任何作者(甚至是提交者,尽管我认为这并不重要)——这就是为什么这些值不能用于任何类型的敏感审计(这就是 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 了解获取它的一种方法)。

但就像我说的,这可能是错误的解决方案。 想想你当初为什么要这么做……

从 cmets 看来,您似乎很关心 git blame 的输出。

总的来说,为什么责备命名“在格式提交之前提交的最后一个人”比命名“运行格式化的 id”更准确?假设您有来自 Alice、Bob 和 Charlie 的提交,然后是格式提交。

A -- B -- C -- F

现在也许 Alice 更改了 file-a.txt,Bob 更改了 file-b.txt,但即使 Charlie 只接触了 file-c.txt,如果 这些文件中的任何一行需要重新格式化,那一行似乎是由查理创作的。就我而言,这比让服务帐户运行格式并仅仅指责“不知道更好”更糟糕。

您可以通过在每次“真实”提交之后进行格式提交来改进这一点……但是一旦你这样做了……

由于您只影响立即之前的提交,您可以在提交格式化提交时使用commit --amend;默认情况下,这不会更改原始提交的作者

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

为什么不设置不正确格式不接受提交的钩子呢?您的服务器可以设置一个 post-receive 挂钩来检查这一点,然后您的用户很可能会选择添加提交挂钩,以便立即消除问题,他们不必稍后再返回修复它。

【讨论】:

    猜你喜欢
    • 2011-04-25
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 2020-11-28
    • 2013-11-12
    • 2016-02-08
    • 2020-06-24
    • 2021-11-01
    相关资源
    最近更新 更多