Git中author和committer的区别?

f87krz0w  于 2023-08-01  发布在  Git
关注(0)|答案(4)|浏览(184)

我在试着做出承诺

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

字符集
其中John Doe是某个用户,我想以他的名字进行提交。
它在git log中显示正确。然而,当我做一个gitk时,作者的名字是正确的,但是提交者的名字是从我的全局git配置设置中选取的(因此被设置为我的名字/电子邮件)。
问题
1.这两者之间有什么区别(提交者与作者)?
1.我是否应该将提交者也设置为其他用户?
1.如果是,怎么做?

osh3o9ms

osh3o9ms1#

原海报问道:
这两个人有什么区别(Committer vs author)?
作者是最初编写代码的人。另一方面,提交者被假定为代表原作者提交代码的人。这在Git中很重要,因为Git允许你重写历史记录,或者代表另一个人应用补丁。FREE online Pro Git book是这样解释的:
您可能想知道 authorcommitter 之间的区别。* 作者 * 是最初编写补丁的人,而 * 提交者 * 是最后应用补丁的人。所以,如果你向一个项目发送了一个补丁,而其中一个核心成员应用了这个补丁,你们两个都得到了荣誉--你是作者,核心成员是提交者。
原海报问道:
我是否应该将提交者也设置为其他用户?
不,如果你想诚实的话,你不应该把提交者设置为作者,除非作者和提交者确实是同一个人。

irlmq6kh

irlmq6kh2#

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

在类似Linux内核的项目中,补丁包括:

生成具有不同作者和提交者的单个新提交:

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

例如,请参见随机选择的补丁和相应的提交:

自Git(Hub|实验室)在同一台机器上同时持有上游和fork存储库,它们可以自动执行您在本地可以执行的任何操作,包括以下任一项:

  • 创建合并提交。

不生成作者!=提交者。
保持SHA或新提交完整,并创建新提交:

* Merge commit (committer == author == project maintainer)
|\
| * Feature commit (committer == author == contributor)
|/
* Old master (random committer and author)

字符集
历史上,这是GitHub上第一个可用的方法。
在本地,这是用git merge --no-ff完成的。
这会产生每个pull请求两次提交,并在git历史记录中保留一个fork。

  • master顶部重新安装底座

GitHub还对提交进行了黑客攻击,设置committer ==谁按下合并按钮。这不是强制性的,甚至在默认情况下,git rebase也不会在本地完成,但它向项目维护者提供了责任。
git tree现在看起来像:

* Feature commit (committer == maintainer, author == contributor)
|
* Old master (random committer and author)


这与git apply电子邮件补丁完全相似。
目前在GitHub上:

  • 通过合并按钮上的下拉菜单选择合并时的方法
  • 所有者可以在repo设置上启用或禁用方法

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上仅显示作者数据。
要查看提交者日期,您可以:

  • 为此设置日志格式:
git log --pretty='%cn %cd' -n1 HEAD


其中cncd代表Committer NameCommitter Date

  • 使用fuller预定义格式:
git log --format=fuller


参见:How to configure 'git log' to show 'commit date'

  • 转到低级别并显示整个提交数据:
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'


参见:What is the difference between author and committer in Git?

Git如何在内部存储author和committer?

git commit对象的文件格式是什么?
基本上,提交是一个文本文件,它包含两个行分隔的字段:

author {author_name} <{author_email}> {author_date_seconds} {author_date_timezone}
committer {committer_name} <{committer_email}> {committer_date_seconds} {committer_date_timezone}


这就清楚地表明,两者都是提交对象中的两个完全独立的数据条目。

vsaztqbk

vsaztqbk3#

proposed to use

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调用(注意双括号)。

zpgglvta

zpgglvta4#

我认为值得一提的是,这里使用的定义只是“预期”的含义。例如,从Pro Git书籍:
作者是最初编写工作的人,而提交者是最后应用工作的人。
重要的是要认识到,您不能 * 信任 * 这些名称是正确的。也许一个更(令人恼火的)迂腐的定义可能是:
作者是(据称)最初编写作品的人,而提交者是(据称)最后应用作品的人。
大多数情况下,我们并不真的需要相信提交中的元数据是真的,但是如果你想更接近这个目标,你可以使用signed commits,这使得信任提交者是签署提交的人变得更容易。

相关问题