[英]Rename multiple names and emails in a single pass of 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 *
這應該從所有分支的所有提交中刪除除a
和b
的所有內容,這應該與完全提取給定目錄相同。
要完成實際拆分,您可以使用像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.