本文介绍Git的提交人和作者的意义。
提交信息设置
Git 是一个分布式版本控制系统,绝大部分操作都是脱离服务器的本地操作,提交(commit)的署名(作者信息)也是由用户本地设置的。Git 安装完毕后,用户要通过下面两个命令设置自己的姓名和邮箱地址。示例如下:
git config --global user.name "Your Name"
git config --global user.email your.name@example.com
之后,用户创建的提交即使用上述命令设置的姓名和邮箱进行署名。
Git提交包含两个署名
如果查看提交时使用详尽格式(--pretty=fuller
),会看到一个提交包含两个署名,一个是作者(Author),一个是提交者(Committer)。例如下面查看 Git 项目 v2.45.0
标签对应的提交,在提交元信息中看到作者(Author)、提交创建时间(AuthorDate)、提交者(Commit)、提交最后修改时间(CommitDate)。
$ git log -1 --pretty=fuller v2.45.0
commit 786a3e4b8d754d2b14b1208b98eeb0a554ef19a8 (tag: v2.45.0, github/maint)
Author: Junio C Hamano <gitgits***@pobox.comuthorDate: 2024-04-29 07:30:29 -0700
Commit: Junio C Hamano <gitgits***@pobox.commmitDate: 2024-04-29 07:30:29 -0700
Git 2.45
Signed-off-by: Junio C Hamano <gits***@pobox.com>
这么做的原因,一个是 Git 项目创始人 Linus Torvalds 在 Git 和 Linux 项目采用的邮件列表方式工作流:
开发者将提交转换为补丁文件,并将补丁文件以邮件格式发送到邮件列表。
开发者通过邮件列表进行代码评审。
经过多次迭代、评审通过后,项目的维护者(Maintainer)将邮件补丁转换为 Git 仓库中的提交。
转换后的提交的原作者(Author)保持不变,而提交者(Committer)是将补丁转换为提交的项目维护者。
例如下面这个提交的作者和提交者不同,就是因为 Git 项目中所采用的邮件列表工作流而形成的。
$ git log -1 --pretty=fuller "tags/v2.44.0-rc0~35^2~5"
commit 4a61faf75d684eb31c23521bc0e3c3cac5fd1553
Author: Jiang Xin <zhzhiyou***@alibaba.comuthorDate: 2024-01-21 21:15:33 +0800
Commit: Junio C Hamano <gitsgits***@pobox.commitDate: 2024-01-22 07:54:37 -0800
transport-helper: no connection restriction in connect_helper
... ... 此处省略 ... ...
Helped-by: Junio C Hamano <gitster@pgits***@pobox.comed-by: Linus Arver <linusa@googllin***@google.comoff-by: Jiang Xin <zhiyou.jxzhiyou***@alibaba-inc.comed-off-by: Junio C Hamano <gits***@pobox.com>
一个提交从创建到完善的过程中往往有两个以上的开发者参与,无法通过提交元信息中的作者和提交者覆盖到。这种情况可以像上面的提交那样在提交说明的末尾(trailer)手动添加签名信息。例如:Helped-by
是提交过程中给过帮助、提出好建议的开发者。Signed-off-by
是作者和提交者的签名。此外还有Reported-by
表示问题的提出者等等。
两个提交署名为提交提供了两个时间戳,一个是提交创建的时间,一个是提交最后修改的时间。因此,即使提交的作者和开发者是同一个人,提供两个署名也很有意义。例如 Git 本地化中的这个提交:
$ git log --pretty=fuller -1 "v2.44.0-rc2~2^2~10"
commit 1bb7fcbffc213db044476998f3a14b2597f3c540
Author: Jiang Xin <woworldhello.***@gmail.comuthorDate: 2024-02-16 11:20:39 +0800
Commit: Jiang Xin <worworldhello.***@gmail.commmitDate: 2024-02-16 11:51:19 +0800
l10n: ci: disable cache for setup-go to suppress warnings
After we upgraded actions/setup-go to v5, the following warning message
was reported every time we ran the CI.
Restore cache failed: Dependencies file is not found ...
Disable cache to suppress warning messages as described in the solution
below.
https://github.com/actions/setup-go/issues/427
Signed-off-by: Jiang Xin <worldhello.***@gmail.com>
这个例子中提交中的两个时间相差半个小时,是因为在完成提交之后,发现提交说明可以继续完善,于是执行了下面的命令完善了提交说明:
$ git commit -s --amend
对提交的作者和提交者的验证
一些公司为了确保公司内的开发者正确配置了邮箱地址,要求对提交者的邮箱进行限制。云效代码平台提供了这个功能。当仓库的推送规则设置中开启了提交邮箱检查,如果提交中的提交者邮箱和推送规则中的设置不符会报错无法推送,开发者需要修改提交中的元信息,对提交者邮箱或者作者邮箱进行修改。参见推送规则设置。
首先开发者要检查是否正确设置了自己的用户名和邮箱。使用命令 git config user.name
和命令git config user.email
查看相关设置。如果设置和预期不符,参考前面的介绍的命令修改相关设置。
如果要修改最新提交的提交者邮箱,使用如下命令:
git commit --amend
如果作者(Author)的邮箱也需要修改,需要增加--reset-author
参数,即使用如下命令:
git commit --reset-author --amend
如果要修改历史提交中的提交说明,使用交互式编辑命令:git rebase -i
,停留在要修改的提交,然后用上述命令修改提交者和作者的署名。关于git rebase
的操作查看相关文档。