我知道这听起来很糟糕,但这是我的用例。
我们有一个庞大的旧代码库,总是带有一些愚蠢的合并冲突,比如额外的逗号或新格式。
我们想引入一个自动代码格式化程序,以使整个项目之间保持一致,并让它为整个项目运行一次,然后在每次推送之前自动运行。
问题来了。如果可能的话,我们希望避免丢失有关谁在上一次提交中更改了什么的信息,因为这个大的“格式提交”只会包含空格、换行符,可能还有几个逗号。这可能吗?
当你提交时,你可以指定你想要的任何作者(甚至是提交者,尽管我认为这并不重要)——这就是为什么这些值不能用于任何类型的敏感审计(这就是为什么 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
输出。
一般来说,为什么将责备命名为“在格式提交之前提交的最后一个人”比命名“运行格式化的 id”更准确?假设您有来自 Alice、Bob 和 Charlie 的提交,然后是格式提交。
A -- B -- C -- F
现在也许 Alice 变了file-a.txt
,Bob 也变了file-b.txt
,但即使 Charlie 只碰过,如果需要对这些文件中的任何一行进行file-c.txt
重新格式化,该行似乎是由 Charlie 创作的。为了我的钱,这比让服务帐户运行格式并仅仅指责“不知道更好”更糟糕。
您可以通过在每次“真实”提交之后放置格式提交来改进这一点......但是一旦你这样做......
由于您只影响立即之前的提交,因此您可以commit --amend
在提交格式化提交时使用;默认情况下,这不会更改原始提交的作者
但这是一个(小)历史重写,所以你真的想在受影响的提交被推送之前在本地进行。一旦你走了那么远......
如果提交格式不正确,为什么不设置不接受提交的钩子呢?您的服务器可以设置一个接收后挂钩来检查这一点,并且您的用户很可能会选择添加提交挂钩,以便立即消除问题,他们不必稍后返回并修复它。