git: 如何用git-am來合併git format-patch生成的一系列的patch.

這篇文章主要介紹一下git-am 和 format-patch 的使用。 由於在git使用當中,
會有不少時候別人(供應商或者其餘的開發人員)發過來一系列的patch,這些patch一般的是相似這樣的名字:linux

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方式是android

patch -p1 < 0001--JFFS2-community-fix-with-not-use-OOB.patch

這樣來打patch,可是這樣會把這些有用的信息丟失。git

因爲這些patch顯然是用git format-patch來生成的,因此用git的工具應該就能夠很好的作好。app

git-am 就是做這件事情。工具

在使用git-am以前, 你要首先git am –abort 一次,來放棄掉之前的am信息,這樣才能夠進行一次全新的am。
否則會遇到這樣的錯誤。
.git/rebase-apply still exists but mbox given.日誌

git-am 能夠一次合併一個文件,或者一個目錄下全部的patch,或者你的郵箱目錄下的patch.code

下面舉兩個例子:orm

  1. 你如今有一個code base: small-src, 你的patch文件放在~/patch/0001-trival-patch.patch

     

cd small-src
git-am ~/patch/0001-trival-patch.patch

若是成功patch上去, 你就能夠去喝杯茶了。ip

若是失敗了, git 會提示錯誤, 好比:開發

error: patch failed: android/mediascanner.cpp:452
error: android/mediascanner.cpp: patch does not apply

這樣你就須要先看看patch, 而後改改錯誤的這個文件,讓這個patch可以patch上去。

  1. 你有一堆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 48869ccbced494e05738090afa5a54f2a261df0f Mon Sep 17 00:00:00 2001
From: zhangjiejing <zhangjiejing@zhangjiejing-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: zhangjiejing <zhangjiejing@zhangjiejing-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
+++ b/file
@@ -1,6 +1,6 @@
 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.
相關文章
相關標籤/搜索