20.2 应用补丁
在前面通过git send-email命令发送邮件给jiangxin用户。现在使用Linux上的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章 补丁中的二进制文件”中予以介绍。