我有一个大型存储库,它目前包含顶级子文件夹中的多个项目,比如/a
、/b
、/c
和/d
。
现在,我想将这个存储库分成两个不同的存储库:一个包含/a
和/b
,另一个包含/c
和/d
。
我知道git filter-branch --subdirectory-filter
,它是提取单个目录的完美方法,但它似乎不能同时提取多个目录。
我也知道git filter-branch --prune-empty --tree-filter
,这将允许我删除所有东西,但这两个想要的目录。这感觉不完全正确,因为我必须手动指定可能存在的所有toplevel目录。
是否有更好的方法从一个大型存储库中提取两个目录?
PS:当然,任何使用git filter-branch
以外的其他东西的好解决方案都很好。;)
发布于 2013-11-13 15:33:46
使用
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 a b
这样的筛选器来获取第一次运行中没有提取的所有更改。
更新:在试图使用--index-filter
加快速度的同时,我找到了一个更简单的解决方案:
git filter-branch -f --prune-empty --index-filter \
'git rm --cached -r -q -- . ; git reset -q $GIT_COMMIT -- a b' -- --all
这只会删除所有内容,然后恢复给定的目录。
发布于 2020-09-08 13:18:40
在搜索并尝试了所提出的解决方案之后,现在推荐的方法是使用git-filter-repo
(参见这里)。
git filter-repo --path a --path b
发布于 2013-11-13 14:14:34
我不知道有什么比tree-filter
更好的方法了。所以你已经有你需要的所有信息了。现在就做吧!
首先创建两个分支:
git branch br1
git branch br2
现在,对于每个分支,检查它,然后使用tree-filter
过滤它。
然后,您可以将它们拆分到单独的目录中,方法是将它们推开,或者通过克隆或拉入它们。
https://stackoverflow.com/questions/19954485
复制相似问题