套用git提交到不同資料夾

一般執行git cherry-pick只會套用到專案下的相同資料夾的相同檔案,
若是要將提交套到不同資料夾下的檔案,需先將提交內容轉成patch檔案,
再視情況使用git am 或 patch

產生patch

git format-patch [--relative <path>] <committish> [--stdout > <patch-file>]

其中

  • –relative是為限制patch範圍在某個子資料夾下,例如僅針對專案下的images的修改,就設定–relative=images 或 –relative images,若不需限制範圍可忽略。
  • <committish>是提交的範圍,例如head^或hash1..hash2
  • –stdout是為了將提交內容顯示在螢幕上,然後再透過 > <patch-file>將標準輸出轉成指定的patch檔案,若不指定 –stdout ,git format-patch則會將每個提交產生個別的patch檔案

套用PATCH到不同資料夾的不同檔案

 patch [--directory <dir>] < <patch-file>

上述指令會將<patch-file>套到指定的<dir>下,如果是同層資料夾可省略–directory。如果<patch-file>套到的是相同檔名的檔案,則會直接套用,若不存在與patch同名的檔案,patch會等待輸入檔名套用,見下圖紅框處,請自行指定要套用的檔名。

套用PATCH到不同資料夾的相同檔案

git am [--directory <dir>] <patch-file>

git am可指定不同資料夾套用patch,但必須是相同檔名,而且檔案的狀態必須與patch前的狀態一模一樣,否則預設狀態下是不會套用patch。

差異

patch指令會將patch檔套到檔案,但不會直接建立提交,git am則在套用patch之後直接建立提交。

結論

無論patch 或 git am,若是要將 patch檔套到現存檔案,檔案的內容必須和patch檔的裡的結構相似,不然是套不過去的,雖然兩者都可以加上–reject,套用適用的patch並將不適用的patch輸出成.rej檔案,並放在目的專案下,但若要套用的patch絕大部份都不相容,上述的操作應該也無法帶來什麼好處,直接用比對工具來處理可能還比較適合。

不過如果需要套用patch的檔案數量很多,也許試試看也無妨,反正也沒有更有效的方法了。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

Proudly using Dynamic Headers by Nicasio WordPress Design