邮件列表+ 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}
这表明两者都是提交对象中两个完全独立的数据项。