[英]Generate patch of uncommitted changes for git repo and submodules
我有一個 git repo foo
,它在自己的文件夾bar
和baz
中有幾個子模塊(實際的 repo 是 eclipse.platform.releng.aggregator)。 我需要為這些存儲庫的更改生成補丁。
我可以使用git --no-pager diff > file.patch
生成一個補丁,該補丁適用於對foo
的更改,但不會報告子模塊bar
或baz
中的更改。
使用git submodule --quiet foreach --recursive git --no-pager diff > file
(摘自this answer )幾乎可以工作,但差異不包括子存儲庫所在文件夾的名稱。
目前我通過手動破解補丁的路徑來解決這個問題,但這僅適用於簡單的補丁和我能想到的腳本解決方案(例如,從 git 獲取子存儲庫名稱,更改到文件夾,在文件夾中生成補丁)意味着我不能使用簡單的git apply
稍后重新應用補丁。
有沒有辦法讓 git 直接而不是通過 foreach 來區分子存儲庫,以便可以簡單地應用生成的補丁?
借助@larsks 提供的線索,我設法找到了以下一個滿足我需要的班輪:
git submodule --quiet foreach --recursive 'export NAME="${PWD##*/}"; git --no-pager diff --src-prefix="a/${NAME}/" --dst-prefix="b/${NAME}/"'
這會將子文件夾的文件夾名稱添加到使用git diff
生成的補丁中,因此即使補丁跨越多個子模塊,我也可以在父文件夾中運行git apply
。 但是請注意,它僅有效,因為我的子模塊都是主 repo 文件夾下的一個文件夾。 如果需要,可以通過將用於將NAME
設置為更聰明的代碼來克服這一問題。
使用子模塊的想法是每個 repo 都是獨立的,它可能由不同的維護者支持並具有不同的批准過程。 此外,回購可以單獨簽出,甚至可以作為子模塊完全不同的回購的一部分。
因此,這里的方法是為每個 repo 獨立創建補丁集並獨立傳遞它們。 如果您在使用git format-patch
提交后創建補丁會更有意義。
在源存儲庫中運行
(git --no-pager diff --src-prefix= --dst-prefix=;\
git submodule foreach --quiet 'git --no-pager diff --src-prefix=$sm_path/ --dst-prefix=$sm_path/' \
) > uncommited.patch
(git --no-pager diff --src-prefix= --dst-prefix=;\
GIT_PROJECT_PATH=$PWD git submodule foreach --quiet --recursive 'git --no-pager diff --src-prefix=$(realpath --relative-to=$GIT_PROJECT_PATH $PWD)/ --dst-prefix=$(realpath --relative-to=$GIT_PROJECT_PATH $PWD)/' \
) > uncommited.patch
在目標存儲庫中運行以應用補丁:
git apply -p 0 uncommited.patch
--no-pager
防止diff
交互模式(注意它是git
參數,而不是diff
)。--src-prefix=
和--dst-prefix=
(空值; ;
是命令分隔符,不是值) 刪除默認路徑前綴,因此它們只包含相對值。--quiet
防止每個文件夾以Entering開頭的行出現在補丁文件中。--recursive
深入嵌套子模塊。realpath
生成源根目錄的相對路徑。$sm_path
是git submodule foreach
提供的環境變量,包含相對模塊文件夾路徑。$PWD
(在foreach
中使用時)是具有當前模塊文件夾絕對路徑的環境變量。GIT_PROJECT_PATH
是具有源根絕對路徑的任意命名環境變量(僅在命令執行期間存在)。 當模塊沒有嵌套時, foreach
提供具有相同值的$toplevel
變量。uncommited.patch
是具有差異的文件,用於源根目錄和所有具有相對於源根目錄的路徑的子模塊。-p 0
在應用時將路徑視為相對於源根目錄(禁用路徑中的前導斜杠剝離)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.