copy from : http://blog.chinaunix.net/uid-27714502-id-3435780.html
篇文章主要介紹一下git-am 和 format-patch 的使用。 因為在git使用當中,會有很多時候別人(供應商或者其他的開發人員)發過來一系列的patch,這些patch通常的是類似這樣的名字:
0001--JFFS2-community-fix-with-not-use-OOB.patch 0002--Community-patch-for-Fix-mount-error-in.patch 0003--partial-low-interrupt-latency-mode-for-ARM113.patch 0004--for-the-global-I-cache-invalidation-ARM11.patch 0005--1-arm-Add-more-cache-memory-types-macr.patch 0006--2-Port-imx-3.3.0-release-to-2.6.28.patch 0007--3-Add-MX25-support.patch 0008--Move-asm-arch-headers-to-linux-inc-dir.patch 0009--1-regulator-allow-search-by-regulator.patch
里面包含了提交的日志,作者,日期等信息。你想做的是把這些patch引入到你的代碼庫中,最好是也可以把日志也引入進來, 方便以后維護用。傳統的打patch方式是
patch -p1 < 0001--JFFS2-community-fix-with-not-use-OOB.patch
這樣來打patch,但是這樣會把這些有用的信息丟失。由於這些patch顯然是用git format-patch來生成的,所以用git的工具應該就可以很好的做好。git-am 就是作這件事情。
在使用git-am之前, 你要首先git am –abort 一次,來放棄掉以前的am信息,這樣才可以進行一次全新的am。
不然會遇到這樣的錯誤。
.git/rebase-apply still exists but mbox given.
git-am 可以一次合並一個文件,或者一個目錄下所有的patch,或者你的郵箱目錄下的patch.
下面舉兩個例子:
- 你現在有一個code base: small-src, 你的patch文件放在~/patch/0001-trival-patch.patch
cd small-src git-am ~/patch/0001-trival-patch.patch
如果成功patch上去, 你就可以去喝杯茶了。如果失敗了, git 會提示錯誤, 比如:
error: patch failed: android/mediascanner.cpp:452 error: android/mediascanner.cpp: patch does not apply
這樣你就需要先看看patch, 然后改改錯誤的這個文件,讓這個patch能夠patch上去。
- 你有一堆patch, 名字是上面提到的那一堆patch, 你把他們放在~/patch-set/目錄下(路徑隨意)
cd opencore git am ~/patch-set/*.patch
(這里git就會按照文件名的順序一次am這些patch)如果一切順利, 你所有的patch都OK了, 你又Lucky了。不過不順利的時候十有八九,如果git am中間遇到了patch,am就會停到打這個patch的地方, 告訴你是哪個patch打不上去。
比如我現在有一個文件file,有兩個patch.
file 的內容是
the text more text
兩個patch分別是:
0001-add-line.patch:
From 8869ccbced494e05738090afa5a54f2a261df0f Mon Sep 1700:00:00 2001 From: abc abc@abc-desktop.(none) Date: Thu, 22 Apr 2010 13:04:34 +0800 Subject: [PATCH 1/2] add line --- file | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/file b/file index 067780e..685f0fa 100644 --- a/file +++ b/file @@ -3,3 +3,5 @@ file: some text more text + +add line -- 1.6.3.3
0002-change-line.patch:
From f756e1b3a87c216b7e0afea9d15badd033171578 Mon Sep 17 00:00:00 2001 From: abc abc@abc-desktop.(none) Date: Thu, 22 Apr 2010 13:05:19 +0800 Subject: [PATCH 2/2] change line --- file | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/file b/file index 685f0fa..7af7852 100644 --- a/file file: -some text +Change line text more text -- 1.6.3.3
運行
git am *.patch
來merge這些patch, 報錯, Patch failed at 0001 add line這樣我們看0001這個patch,原來patch需要的是some text, 而file里面是the text, 所以我們用編輯器把這行改成some text,
vi file git apply 0001-add-line.patch git add file git am --resolved
在解決完沖突以后, 比如用git add來讓git知道你已經解決完沖突了。
- 如果你發現這個沖突是無法解決的, 要撤銷整個am的東西。 可以運行git am –abort,
- 如果你想只是忽略這一個patch,可以運行git am –skip來跳過這個patch.