1. 程式人生 > >Git打補丁常見問題

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檔案。

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述