git format-patch输出的第一行是什么?

38
在运行 git format-patch 时,目的是创建您编写代码的电子邮件表示形式。目前为止还不错。我不是电子邮件专家,但似乎这个格式化补丁输出的第一行不符合标准的电子邮件头格式... "From de8d128fb520416e0b029c913b3a5ce900d0320c Mon Sep 17 00:00:00 2001" 是什么?日期是干什么用的?它看起来对我来说是任意的,并且还防止我将其管道传输到 sendmail。每次想要发送补丁时,我都必须手动删除该行。

谢谢。


git log -S 'Mon Sep 17 00:00:00 2001' --all -p --source --reverse -- . ':(exclude)t' 显示是 Hamano 提交了引入魔法日期的提交,但它并没有说明为什么选择了这个日期。UNIX 时间戳似乎也不是一个非常特殊的数字:1000677600,尽管它比字符串更整洁。 - Ciro Santilli OurBigBook.com
另外,SHA-1是提交的哈希值,但它有点无用,因为一旦应用新的提交者和父提交,SHA-1就会改变。 - Ciro Santilli OurBigBook.com
5个回答

33

来自 git help format-patch

讨论: git format-patch 生成的补丁以UNIX邮箱格式输出,并带有一个固定的“魔法”时间戳,以表明该文件是由format-patch输出而不是真实的邮箱,如下所示:

       From 8f72bad1baf19a53459661343e21d6491c3908d3 Mon Sep 17 00:00:00 2001
       From: Tony Luck <tony.luck@intel.com>
       Date: Tue, 13 Jul 2010 11:42:54 -0700
       Subject: [PATCH] =?UTF-8?q?> > [IA64]=20Put=20ia64=20config=20files=20on=20the=20?=
        =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig=20diet?=
       MIME-Version: 1.0
       Content-Type: text/plain; charset=UTF-8
       Content-Transfer-Encoding: 8bit

值得注意的是,Linux内核的第一个版本是由Linus Torvalds于1991年9月17日发布的。 - sidcha
@sidcha 这与什么相关呢? - DarkTrick
2
@DarkTrick,原帖中提到了9月17日这个日期。回答中称其为一个魔法数字。我只是补充说可能是因为这个原因而被选择的。 - sidcha

11
作为对Fredrik's answer的补充,以下是Junio Hamano的相关评论:

"Mon Sep 17 00:00:00 2001"只是一个假的随机日期,用于使Unix-From行被常见的MUA识别,与您的提交对象无关。真正的日期在Date:标题中。

我曾经试图将其更改为git的生日(Thu Apr 7 15:13:13 2005 -0700),我记得当时发现有些人的脚本(或者也许是MUA)被打破了,并关心“7”之前是什么...在Unix-From行上并且抛弃那次更新。

"From $SHA1 $magic_timestamp"行和其他标题行存在的目的是使其看起来像mbox

链接:123


2
对于 Hamano 的引用点赞加一。但我希望有人能够解释为什么选择了那个“魔法日期”,或者它是否只是随意选择的。 - Ciro Santilli OurBigBook.com
1
根据您提供的日期,您违反了 mbox 格式,其中日期应该采用标准 C asctime 格式。月份和日期之间为单个数字日期时,日字段为填充空格的右对齐 2 位数字(%2d),这使得月份和日期之间有两个空格。请参考MBOX 电子邮件格式asctime。事实上,一些人的脚本(或者可能是 MUA)出现了问题,并且关注了“7”之前的内容。 - Thomas Guyot-Sionnest
“我记得情况是有些人的脚本(或者也许是MUA)出了问题,关心在“7”之前出现的是哪个“7”?是第一个“7”还是第二个?” - Flux

5
输出格式为mbox格式。您可以轻松地使用以下命令去掉第一行:
git format-patch --stdout <range> | sed 1d

然后你可以随意处理结果。

或者,您也可以使用git本身来发送电子邮件。尝试:

git send-mail --smtp-server=<your server> *.patch

查看GIT Send-Mail Manpage获取所有选项。


2
Git 2.32 (Q2 2021)实际上在文档的其余部分开始引用它们之前,提前解释了format-patch输出的一些部分。
请参见提交28e29ee(2021年3月24日)由Junio C Hamano(gitster撰写。
(由Junio C Hamano -- gitster --合并于提交5c2f7ff,2021年3月30日)

format-patch:概述“补丁”消息是什么

这段文字说准备了一个“补丁”来记录每个提交,它适合通过电子邮件提交,使用“am”命令可以使用它,但没有说明“补丁”到底是什么。

页面描述还提到了“三破折号”行,但如果读者没有更详细的概述,“三破折号”行也不清楚是什么。

添加一个简短的段落,概述输出的外观。

git format-patch现在在其man手册中包括:

每次提交都要准备一个“补丁”和一个“消息”,每个提交一个“消息”,格式类似于UNIX邮箱。
由命令生成的“消息”包括三个部分:
- 一个简短的元数据报头,以开头,带有固定的日期戳Mon Sep 17 00:00:00 2001,以帮助"file(1)"等程序识别文件是从这个命令输出的,记录作者身份、作者日期和更改标题(从提交日志消息的第一段中提取)的字段。 - 提交日志消息的第二段和后续段落。 - “补丁”,即提交和其父级之间的“diff -p --stat”输出(请参见git diff)。
日志消息和补丁之间用三条破折号隔开。

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接