首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用git过滤器分支提取多个目录。

使用git过滤器分支提取多个目录。
EN

Stack Overflow用户
提问于 2013-11-13 12:59:31
回答 4查看 11.6K关注 0票数 27

我有一个大型存储库,它目前包含顶级子文件夹中的多个项目,比如/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以外的其他东西的好解决方案都很好。;)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-11-13 15:33:46

使用

代码语言:javascript
运行
复制
git filter-branch -f --prune-empty --tree-filter 'bash preserve-only.sh a b' -- --all

其中preserve-only.sh是:

代码语言:javascript
运行
复制
IFS=':'
GLOBIGNORE="$*"
rm -rf *

这将从所有分支的所有提交中删除除ab之外的所有内容,这与提取给定的目录完全相同。

要完成实际的拆分,可以使用像rm -rf a b这样的筛选器来获取第一次运行中没有提取的所有更改。

更新:在试图使用--index-filter加快速度的同时,我找到了一个更简单的解决方案:

代码语言:javascript
运行
复制
git filter-branch -f --prune-empty --index-filter \
  'git rm --cached -r -q -- . ; git reset -q $GIT_COMMIT -- a b' -- --all

这只会删除所有内容,然后恢复给定的目录。

票数 49
EN

Stack Overflow用户

发布于 2020-09-08 13:18:40

在搜索并尝试了所提出的解决方案之后,现在推荐的方法是使用git-filter-repo (参见这里)。

代码语言:javascript
运行
复制
git filter-repo --path a --path b
票数 8
EN

Stack Overflow用户

发布于 2013-11-13 14:14:34

我不知道有什么比tree-filter更好的方法了。所以你已经有你需要的所有信息了。现在就做吧!

首先创建两个分支:

代码语言:javascript
运行
复制
git branch br1
git branch br2

现在,对于每个分支,检查它,然后使用tree-filter过滤它。

然后,您可以将它们拆分到单独的目录中,方法是将它们推开,或者通过克隆或拉入它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19954485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档