20.2 应用补丁

在前面通过git send-email命令发送邮件给jiangxin用户。现在使用Linux上的mail命令检查一下邮件。


$mail

Mail version 8.1.2 01/15/2001.Type?for help.

"/var/mail/jiangxin":3 messages 3 unread

>N 1 user1@sun.ossxp.c Thu Jan 13 18:02 38/1120[PATCH 1/3]Fix typo:-help

to—help.

N 2 user1@sun.ossxp.c Thu Jan 13 18:02 227/6207

=?UTF-8?q?=5BPATCH=202/3=5D=20Add=20I18N=20support=2E?=

N 3 user1@sun.ossxp.c Thu Jan 13 18:02 95/2893

=?UTF-8?q?=5BPATCH=203/3=5D=20Translate=20for=20Chinese=2E?=


如果邮件不止这三封,需要将三个包含补丁的邮件挑选出来保存到另外的文件中。例如在mail命令的提示符(&)下输入命令将选定的邮件保存为单独的文件。


&s 1-3 user1-mail-archive

"user1-mail-archive" [New file]

&q


上面的操作在本地创建了一个由开发者user1的补丁邮件组成的归档文件user1-mail-archive,这个文件是mbox格式的,可以用mail命令打开。


$mail-f user1-mail-archive

Mail version 8.1.2 01/15/2001.Type?for help.

"user1-mail-archive":3 messages

>1 user1@sun.ossxp.c Thu Jan 13 18:02 38/1121[PATCH 1/3]Fix typo:-help

to—help.

2 user1@sun.ossxp.c Thu Jan 13 18:02 227/6208=?UTF-8?q?=5BPATCH=202/3=5D=

20Add=20I18N=20support=2E?=

3 user1@sun.ossxp.c Thu Jan 13 18:02 95/2894=?UTF-8?q?=5BPATCH=203/3=5D=

20Translate=20for=20Chinese=2E?=

&q


使用git am命令可以使得保存在mbox中的邮件批量地应用在版本库中。am是apply email的缩写。下面就演示一下如何使用git am命令应用补丁,具体操作过程如下。

(1)基于HEAD~3版本创建一个本地分支,以便在该分支下应用补丁。


$git checkout-b user1 HEAD~3

Switched to a new branch 'user1'


(2)将mbox文件user1-mail-archive中的补丁全部应用在当前分支上。


$git am user1-mail-archive

Applying:Fix typo:-help to—help.

Applying:Add I18N support.

Applying:Translate for Chinese.


(3)补丁成功应用上了,看看提交日志。


$git log-3—pretty=fuller

commit 2d9276af9df1a2fdb71d1e7c9ac6dff88b2920a1

Author:Jiang Xin<jiangxin@ossxp.com>

AuthorDate:Thu Jan 13 18:02:03 2011+0800

Commit:user1<user1@sun.ossxp.com>

CommitDate:Thu Jan 13 18:21:16 2011+0800

Translate for Chinese.

Signed-off-by:Jiang Xin<jiangxin@ossxp.com>

Signed-off-by:user1<user1@sun.ossxp.com>

commit 41227f492ad37cdd99444a5f5cc0c27288f2bca4

Author:Jiang Xin<jiangxin@ossxp.com>

AuthorDate:Thu Jan 13 18:02:02 2011+0800

Commit:user1<user1@sun.ossxp.com>

CommitDate:Thu Jan 13 18:21:15 2011+0800

Add I18N support.

Signed-off-by:Jiang Xin<jiangxin@ossxp.com>

Signed-off-by:user1<user1@sun.ossxp.com>

commit 4a3380fb7ae90039633dec84acc2aab85398efad

Author:user1<user1@sun.ossxp.com>

AuthorDate:Thu Jan 13 18:02:01 2011+0800

Commit:user1<user1@sun.ossxp.com>

CommitDate:Thu Jan 13 18:21:15 2011+0800

Fix typo:-help to—help.

Signed-off-by:user1<user1@sun.ossxp.com>


从提交信息中可以看出:

提交的时间信息使用了邮件发送的时间。

作者(Author)的信息被保留,和补丁文件中的一致。

提交者(Commit)全都设置为user1,因为提交是在user1的工作区完成的。

提交说明中的签名信息被保留。实际上git am命令也可以提供-s参数,在提交说明中附加执行命令用户的签名。

对于不习惯在控制台用mail命令接收邮件的用户,可以通过邮件附件、U盘或其他方式获取git format-patch生成的补丁文件,将补丁文件保存在本地,通过管道符调用git am命令应用补丁。


$ls*.patch

0001-Fix-typo-help-to-help.patch 0002-Add-I18N-support.patch

0003-Translate-for-Chinese.patch

$cat*.patch|git am

Applying:Fix typo:-help to—help.

Applying:Add I18N support.

Applying:Translate for Chinese.


Git还提供一个命令git apply,可以应用一般格式的补丁文件,但是不能执行提交,也不能保持补丁中的作者信息。实际上git apply命令和GNU patch命令类似,细微差别将在本书第7篇的“第38章 补丁中的二进制文件”中予以介绍。