簡體   English   中英

為 git repo 和子模塊生成未提交更改的補丁

[英]Generate patch of uncommitted changes for git repo and submodules

我有一個 git repo foo ,它在自己的文件夾barbaz中有幾個子模塊(實際的 repo 是 eclipse.platform.releng.aggregator)。 我需要為這些存儲庫的更改生成補丁。

我可以使用git --no-pager diff > file.patch生成一個補丁,該補丁適用於對foo的更改,但不會報告子模塊barbaz中的更改。

使用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_pathgit submodule foreach提供的環境變量,包含相對模塊文件夾路徑。
  • $PWD (在foreach中使用時)是具有當前模塊文件夾絕對路徑的環境變量。
  • GIT_PROJECT_PATH是具有源根絕對路徑的任意命名環境變量(僅在命令執行期間存在)。 當模塊沒有嵌套時, foreach提供具有相同值的$toplevel變量。
  • uncommited.patch是具有差異的文件,用於源根目錄和所有具有相對於源根目錄的路徑的子模塊。
  • -p 0在應用時將路徑視為相對於源根目錄(禁用路徑中的前導斜杠剝離)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM