Git打補丁常見問題
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
Git打補丁常見問題
往往覺得得到某個功能的補丁就認為這個功能我就已經成功擁有了,但是在最後一步的打補丁的工作也是需要相當謹慎的,甚至有可能還要比你獲取這個補丁花費的時間還要多。看到好多同行遇到這個問題,且最近自己也花費近20天「獲取,打,驗證」一個特性功能的補丁。趁熱總結一下,知識點可能不多,但是問題是相當棘手的。
$ git apply -h
usage: git apply [options] [<patch>...]
--exclude <path> don't apply changes matching the given path
--include <path> apply changes matching the given path
-p <num> remove <num> leading slashes from traditional diff paths
--no-add ignore additions made by the patch
--stat instead of applying the patch, output diffstat for the input
--numstat show number of added and deleted lines in decimal notation
--summary instead of applying the patch, output a summary for the input
--check instead of applying the patch, see if the patch is applicable
--index make sure the patch is applicable to the current index
--cached apply a patch without touching the working tree
--apply also apply the patch (use with --stat/--summary/--check)
-3, --3way attempt three-way merge if a patch does not apply
--build-fake-ancestor <file>
build a temporary index based on embedded index information
-z paths are separated with NUL character
-C <n> ensure at least <n> lines of context match
--whitespace <action>
detect new or modified lines that have whitespace errors
--ignore-space-change
ignore changes in whitespace when finding context
--ignore-whitespace ignore changes in whitespace when finding context
-R, --reverse apply the patch in reverse
--unidiff-zero don't expect at least one line of context
--reject leave the rejected hunks in corresponding *.rej files
--allow-overlap allow overlapping hunks
-v, --verbose be verbose
--inaccurate-eof tolerate incorrectly detected missing new-line at the end of file
--recount do not trust the line counts in the hunk headers
--directory <root> prepend <root> to all filenames
$
第一步檢測補丁有無問題
$ git apply --check xxx.patch
能檢測出現的問題有以下幾種例子:
1. error: cannot apply binary patch to 'xxx' without full index line
xxx一般會是bin/png/gif等等二進位制檔案 具體的原因就是patch中有指明要打上xxx檔案,但是這個檔案並不包含在這個patch中,僅僅是有一個名字存在其中。遇到這個問題要重視。
2. error: core/java/android/provider/Settings.java: patch does not apply
出現這種一般會是補丁衝突,這種一般是強制打上補丁(使用--reject)後根據產生的*.rej檔案來手動解決衝突。
3. warning: core/java/android/view/View.java has type 100644, expected 100755
出現這種警告一般是檔案內沒有衝突,但是檔案的許可權發生變動。一般沒有影響。
第二步強制打補丁
$ git apply --reject xxx.patch
執行了這一步後會產生什麼樣的結果,我對第一步的衝突來對應說明。
1.這種問題一般是製作補丁的開發人員沒有將二進位制檔案製作到patch中雲,對於這種情況不會有任何的提示,因為patch中源資原始檔都沒有,Git也沒有什麼招術來解決。最好的方法是聯絡補丁提供者。
2.這種情況是由於git apply是對比補丁中前後幾行程式碼,如果沒有出現在目標檔案中,那麼這就是衝突。這個是比較經常出現的,對於這種情況會生成*.rej檔案,可以find ./ -name *.rej找到這些衝突的補丁,手動打上就好。
3.可以考慮忽略。
目前就這些,遇到新的問題再補充。
git am -3 -k後如果有衝突,不要執行git checkout。如果不願意修改衝突檔案,佯裝修改一下,新增進去才能進行下一步。
git --git-dir=../other_proj_dir/.git format-patch -k -1 --stdout xxxxxxxxxxxxxxxxxx | git am -3 -k
git am同樣有--reject選項,新增這個選項可以將能打上的補丁先打上,衝突的檔案生成*.rej檔案。