patch教學 - git output commit as patch



如何將git補丁從一個存儲庫應用到另一個存儲庫? (6)

使用--relative選項進行format-patch可以改善抽象(隱藏有關生成補丁的存儲庫的無關詳細信息)。

[repository-with-changes]
git format-patch --relative=(path-to-library) (base-commit-for-patch) ## 'HEAD~1'

我發現在應用補丁時需要使用--3way選項(以避免does not exist in index錯誤does not exist in index ) - 您的里程可能會有所不同。 如果目標路徑不是存儲庫的根,則可能只需要使用--directory=(...)

[repository-to-update]
git am --3way --directory=(path-to-library) (patch-file)
  • format-patch將在每次提交後創建一個補丁文件,因為'base'是當前分支。

  • 在某些情況下 ,似乎缺少 --relative選項的文檔,但它似乎仍然有效(從版本2.7.4開始)。

我有兩個存儲庫,一個是庫的主要倉庫,另一個是使用該庫的項目。

如果我修復了subservient項目,我想要一個簡單的方法將該補丁應用到上游。

每個存儲庫中文件的位置都不同。

  • 主要回購: www.playdar.org/static/playdar.js
  • 項目: playlick.com/lib/playdar.js

我嘗試在playlick項目中使用git format-patch -- lib/playdar.js ,然後在主playdar repo上使用git am ,但是補丁文件中的不同文件位置引發了錯誤。

有沒有一種簡單的方法可以將給定文件中給定提交的補丁應用到其他地方的另一個任意文件?

對於獎勵積分,如果您要應用補丁的文件不在git存儲庫中,該怎麼辦?


Answer #1

假設這兩個項目都是git項目,那麼聽起來submodules將非常適合您。 這允許git項目動態鏈接到另一個git項目,實際上是在另一個git倉庫中烘焙git repo,兩者都有自己獨特的生命。

換句話說,將“main repo”添加為“project”中的子模塊。 每當你在“主回購”中提交/推送新東西時,你只需git pull它們拉回“項目”。


Answer #2

完成Henrik的答案 ,並獲得獎勵積分

如果要應用補丁的文件不在git存儲庫中該怎麼辦?

如果您可以訪問來自git存儲庫的補丁的候選文件目錄,您可以先將目錄/文件樹轉換為git存儲庫本身! (' git init ':git存儲庫畢竟是根目錄中的.git)。
然後,您將該repo設置為主項目的子模塊。


Answer #3

您可以暫時刪除(重命名)主存儲庫。

cd to/main/project
mv .git .git_
cd to/sub/project
git apply patchname
cd -
mv .git_ .git


Answer #5

git format-patch patch生成git format-patch只是一個文本文件 - 您可以編輯diff標頭,以便修改不同的路徑。

所以例如它會產生這樣的東西:

diff --git a/lib/playdar.js b/lib/playdar.js
index 1234567..89abcde
-- a/lib/playdar.js
++ b/lib/playdar.js

您所要做的就是將lib/playdar.js更改為static/playdar.js然後通過git am"運行補丁git am"

對於沒有git人來說,補丁應該可以被標準GNU補丁實用程序讀取---但是在這種情況下不要使用-M-C等選項來運行format-patch以生成重命名補丁,因為對它們的支持並不普遍。





git-patch