簡體   English   中英

使用 git-filter-branch 提取多個目錄

[英]extract multiple directories using git-filter-branch

我有一個大型存儲庫,目前在頂級子文件夾中包含多個項目,例如/a/b/c/d

現在我想將該存儲庫拆分為兩個不同的存儲庫:一個包含/a/b ,另一個包含/c/d

我知道git filter-branch --subdirectory-filter ,它非常適合提取單個目錄,但它似乎無法一次提取多個目錄。

我也知道git filter-branch --prune-empty --tree-filter ,它允許我刪除所有內容,但兩個想要的目錄。 這感覺並不完全正確,因為我必須手動指定可能存在的所有頂級目錄。

有沒有更好的方法從大存儲庫中提取兩個目錄?

PS:當然,任何使用git filter-branch以外的東西的好的解決方案都可以。 ;)

git filter-branch -f --prune-empty --tree-filter 'bash preserve-only.sh a b' -- --all

其中, preserve-only.sh是:

IFS=':'
GLOBIGNORE="$*"
rm -rf *

這應該從所有分支的所有提交中刪除除ab的所有內容,這應該與完全提取給定目錄相同。

要完成實際拆分,您可以使用像rm -rf ab這樣的過濾器來獲取第一次運行中未提取的所有更改。


更新:在嘗試使用--index-filter加快速度時,我找到了一個更簡單的解決方案:

git filter-branch -f --prune-empty --index-filter \
  'git rm --cached -r -q -- . ; git reset -q $GIT_COMMIT -- a b' -- --all

這只是刪除所有內容,然后再恢復給定的目錄。

在四處搜索並嘗試了建議的解決方案之后,現在似乎推薦的做法是使用git-filter-repo (請參閱此處

git filter-repo --path a --path b

我不知道有什么比tree-filter更好的方法。 因此,您已經擁有所需的所有信息。 現在就去做吧!

首先創建你的兩個分支:

git branch br1
git branch br2

現在對於每個分支,檢查它,然后使用tree-filter過濾它。

然后,您可以通過將它們推出,或者通過克隆或拉入將它們拆分為單獨的目錄。

我更喜歡這個

git filter-branch -f --prune-empty --tree-filter "ls -I a -I b | xargs rm -rf"  -- --all

暫無
暫無

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

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