git commit --author="John Doe <john@doe.com>" -m "<the usual commit message>"
其中John Doe是我想要以其名义提交的某个用户。
在git log
中看起来没问题。但是,当我执行gitk
时,作者名称正确,但提交者名称则取自我的全局git配置设置(因此设置为我的姓名/电子邮件)。
问题
提交者和作者之间有什么区别?
我是否应该将提交者也设置为另一个用户?
如果是,如何操作?
git commit --author="John Doe <john@doe.com>" -m "<the usual commit message>"
其中John Doe是我想要以其名义提交的某个用户。
在git log
中看起来没问题。但是,当我执行gitk
时,作者名称正确,但提交者名称则取自我的全局git配置设置(因此设置为我的姓名/电子邮件)。
提交者和作者之间有什么区别?
我是否应该将提交者也设置为另一个用户?
如果是,如何操作?
原帖提问:
提交者和作者有什么区别?
作者是最初编写代码的人。提交者则是代表原始作者提交代码的人。这在Git中非常重要,因为Git允许您重写历史记录或代表其他人应用补丁。免费在线的Pro Git书这样解释:
您可能想知道作者和提交者之间的区别是什么。 作者是最初编写补丁的人,而提交者是最后应用补丁的人。因此,如果您向项目发送补丁,并且其中一个核心成员应用了该补丁,则您和核心成员都会获得信用-您作为作者,核心成员作为提交者。
原帖提问:
不,如果你想要诚实,你不应该将提交者设置为作者,除非作者和提交者确实是同一个人。我是否也应将提交者设置为其他用户?
git config user
,然后执行git add
和git commit
命令时,Git会知道谁添加了和提交了代码,但它仍然不知道谁写的。 - cowlinator邮件列表 + git format-patch
+ git apply
可以生成作者与提交者不同的提交记录
在像Linux内核这样的项目中,补丁是:
git format-patch
生成git send-email
git apply
或git am
应用:如何使用 git am 应用来自电子邮件信息的补丁?生成一个具有不同作者和提交者的新提交记录:
例如,请查看此随机选择的补丁和相应的提交记录:
Git Web界面(如GitHub和GitLab)可能会生成作者与提交者不同的提交记录
由于Git(Hub|Lab)在同一台机器上保存了上游和分支存储库,因此它们可以像本地一样自动执行任何操作,包括以下任一操作:
创建合并提交。
不会生成作者与提交者不同的提交记录。
保持新提交的SHA或完整性,并创建新的提交:
* Merge commit (committer == author == project maintainer)
|\
| * Feature commit (committer == author == contributor)
|/
* Old master (random committer and author)
在GitHub上,历史上这是第一个可用的方法。
在本地,可以使用git merge --no-ff
来执行此操作。
这将为每个拉取请求生成两个提交,并在git历史记录中保留一个分支。
在master
上进行变基
GitHub还会修改提交以设置提交者==按下合并按钮的人。这不是必需的,甚至不是默认情况下由git rebase
本地执行的操作,但它可以为项目维护者提供责任追究。
现在git树看起来像:
* Feature commit (committer == maintainer, author == contributor)
|
* Old master (random committer and author)
这与git apply
电子邮件补丁的方式完全相同。
目前在GitHub上:
https://help.github.com/articles/about-merge-methods-on-github/
如何设置新提交的提交者?
我能找到的最好的方法是使用环境变量来覆盖提交者:
GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author 'a <a>'
如何获取给定提交的提交者和提交日期?git log --pretty='%cn %cd' -n1 HEAD
其中cn
和cd
表示Committer Name
和Committer Date
使用预定义的fuller
格式:
git log --format=fuller
另请参阅:如何配置'git log'以显示提交日期
进入低级别并显示整个提交数据:
git cat-file -p HEAD
如何设置一个新提交的提交者时间?
git commit --date
只能设置作者日期:对于提交者日期,我找到的最好方法是使用环境变量:
GIT_COMMITTER_DATE='2000-01-01T00:00:00+0000' git commit --date='2000-01-01T00:00:00+0000'
另请参见:Git中作者和提交者之间的区别是什么?
Git如何在内部存储作者和提交者?
请参见:Git提交对象的文件格式是什么?
基本上,提交是一个文本文件,它包含两个用换行符分隔的字段:
author {author_name} <{author_email}> {author_date_seconds} {author_date_timezone}
committer {committer_name} <{committer_email}> {committer_date_seconds} {committer_date_timezone}
这说明两者在提交对象中是完全独立的数据条目。
GIT_COMMITTER_*
覆盖,如果您没有使用 git config
设置默认提交者,git 仍将拒绝执行提交。 - adelphusGIT_{COMMITTER,AUTHOR}_EMAIL
,它可以正常工作。 - Ciro Santilli OurBigBook.com
GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author 'a <a>'
如果您不小心使用了不同的姓名和电子邮件,并且希望将它们设置为相同的值:
GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author "$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
这首先设置变量,然后在git commit
调用中使用它们(注意双括号)。
我认为值得一提的是,这里使用的定义仅限于预期的意义。例如,来自《Pro Git》书籍:
作者是最初编写作品的人,而提交者是最后应用该作品的人。
重要的是要意识到你不能相信这些名称是正确的。也许一个更(令人恼人地)迂腐的定义可能是:
作者是(据称)最初编写作品的人,而提交者是(据称)最后应用该作品的人。
大多数情况下,我们实际上并不需要相信提交中的元数据是真实的,但如果你想更接近这个目标,你可以使用已签名的提交,这样更容易相信提交者是签署该提交的人。