我试着做一个承诺

git commit --author="John Doe <john@doe.com>" -m "<the usual commit message>"

John Doe是某个用户,我想以他的名字进行提交。

它在git日志中显示正常。然而,当我做一个gitk时,作者的名字是正确的,但是提交者的名字是从我的全局git配置设置中挑选的(因此设置为我的名字/电子邮件)。

问题

这两者(提交者和作者)之间的区别是什么? 我是否也应该将提交者设置为其他用户? 如果是,怎么做?


最初的海报问道:

这两者(提交者和作者)之间的区别是什么?

作者是最初编写代码的人。另一方面,提交者被假定为代表原始作者提交代码的人。这在Git中很重要,因为Git允许您重写历史,或者代表其他人应用补丁。免费在线Pro Git书是这样解释的:

您可能想知道作者和提交者之间有什么区别。作者是最初编写补丁的人,而提交者是最后应用补丁的人。所以,如果你向一个项目发送了一个补丁,其中一个核心成员应用了这个补丁,你和核心成员都得到了荣誉——你是作者,核心成员是提交者。

最初的海报问道:

我是否也应该将提交者设置为其他用户?

不,如果您想要诚实,您不应该将提交者设置为作者,除非作者和提交者确实是同一个人。


邮件列表+ git format-patch + git apply可以生成作者!=提交者

在像Linux内核这样的项目中,补丁是:

由git format-patch生成 通过电子邮件发送,或者通过复制粘贴,或者更常见的使用git send-email 由另一个人使用git apply或git am:如何使用git am从电子邮件应用补丁?

生成一个包含不同作者和提交者的新提交:

作者是编写补丁的人 提交者是项目维护者,是合并补丁的人

请看这个随机选择的补丁和相应的提交:

https://lkml.org/lkml/2018/1/25/568 https://github.com/torvalds/linux/commit/5beda7d54eafece4c974cfa9fbb9f60fb18fd20a

像GitHub和GitLab这样的Git web界面可能生成作者,也可能不生成提交者

因为Git(Hub|Lab)在同一台机器上拥有上游和fork存储库,所以它们可以自动地做任何你在本地可以做的事情,包括:

Create a merge commit. Does not generate author != committer. Keeps the SHA or the new commit intact, and creates a new commit: * Merge commit (committer == author == project maintainer) |\ | * Feature commit (committer == author == contributor) |/ * Old master (random committer and author) Historically, this was the first available method on GitHub. Locally, this is done with git merge --no-ff. This produces two commits per pull request, and keeps a fork in the git history. rebase on top of master GitHub also hacks the commits to set committer == whoever pressed the merge button. This is not mandatory, and not even done by default locally by git rebase, but it gives accountability to the project maintainer. The git tree now looks like: * Feature commit (committer == maintainer, author == contributor) | * Old master (random committer and author) which is exactly like that of the git apply email patches.

目前在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日志中只显示作者数据。

要查看提交日期,您可以:

专门格式化日志: git log——pretty='%cn %cd' -n1 HEAD 其中cn和cd代表提交人姓名和提交人日期 使用更完整的预定义格式: Git日志——format=full 参见:如何配置'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_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提交调用(注意双括号)。