我正在努力做出像
这样的提交git commit --author="John Doe <john@doe.com>" -m "<the usual commit message>"
其中John Doe是我想要提交其名称的某个用户。
在git log
中可以正常显示。但是,当我执行gitk
时,作者姓名是正确的,但提交者名称是从我的全局git配置设置中选取的(因此设置为我的姓名/电子邮件)。< / p>
两者(提交者与作者)有什么区别?
我是否应该将提交者设置为其他用户?
如果是,怎么做?
答案 0 :(得分:174)
原始海报问:
两者之间有什么区别(提交者与作者)?
作者是最初编写代码的人。另一方面,提交者被假定为代表原作者提交代码的人。这在Git中很重要,因为Git允许您重写历史记录,或者代表他人应用补丁。 FREE online Pro Git book解释如下:
您可能想知道 author 和 committer 之间的区别。 作者是最初编写补丁的人,而提交者是最后一次应用补丁的人。因此,如果您向项目发送补丁并且其中一个核心成员应用了补丁,那么您都会得到信任 - 您作为作者,核心成员作为提交者。
原始海报问:
我是否应该将提交者设置为其他用户?
不,如果你想说实话,你不应该将提交者设置为作者,除非作者和提交者确实是同一个人。
答案 1 :(得分:76)
邮件列表+ git format-patch
+ git apply
可以生成作者!=提交者
在Linux内核之类的项目中,修补程序是:
git format-patch
git send-email
git apply
或git am
申请:How to use git am to apply patches from email messages? 使用不同的作者和提交者生成一个新的提交:
例如,参见这个随机选择的补丁和相应的提交:
像GitHub和GitLab这样的Git Web界面可能会也可能不会生成作者!=提交者
由于Git(Hub | Lab)在同一台机器上同时拥有上游和fork存储库,因此它们可以自动执行您可以在本地执行的任何操作,包括:
创建合并提交。
不生成作者!=提交者。
保持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
。
要查看提交者日期,您可以:
专门针对该日志格式化日志:
git log --pretty='%cn %cd' -n1 HEAD
其中cn
和cd
代表Committer Name
和Committer Date
使用fuller
预定义格式:
git log --format=fuller
转到低级并显示整个提交数据:
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如何在内部存储作者vs提交者?
请参阅:What is the file format of a git commit object?
基本上,提交是一个文本文件,它包含两个行分隔的字段:
author {author_name} <{author_email}> {author_date_seconds} {author_date_timezone}
committer {committer_name} <{committer_email}> {committer_date_seconds} {committer_date_timezone}
这清楚地表明两者都是提交对象中的两个完全独立的数据条目。
答案 2 :(得分:0)
@Ciro Santilli新疆改造中心六四事件法轮功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
调用(请注意双括号)。