Git 将给定的文件集提取到存储库

Git 将给定的文件集提取到存储库,git,git-filter-branch,git-filter-repo,Git,Git Filter Branch,Git Filter Repo,我打算从一个包含10000次提交和5000个文件的存储库中提取少量文件,并将其保存到一个单独的存储库中。这些文件分布在多个目录中,这些目录中有不相关的文件 git筛选器分支的-子目录筛选器实际上不是一个选项,因为它只接受一个目录。此外,它不遵循重命名,因此,如果文件最初引入另一个目录,则会丢失部分历史记录 我目前的解决办法是: git filter-branch --tree-filter 'fd -E 3166 -X rm -rf' 其中,3166是所有提取文件的文件名的唯一部分。它所做的是

我打算从一个包含10000次提交和5000个文件的存储库中提取少量文件,并将其保存到一个单独的存储库中。这些文件分布在多个目录中,这些目录中有不相关的文件

git筛选器分支的-子目录筛选器实际上不是一个选项,因为它只接受一个目录。此外,它不遵循重命名,因此,如果文件最初引入另一个目录,则会丢失部分历史记录

我目前的解决办法是:

git filter-branch --tree-filter 'fd -E 3166 -X rm -rf'
其中,3166是所有提取文件的文件名的唯一部分。它所做的是通过所有提交,找到所有不相关的文件并删除它们。这是可怕的缓慢,然而,它需要几个小时

有更好的方法吗?

我想您可以测试git upstream建议使用的filter repo,而不是filter branch。您可以在其中指定多个文件夹。。。。我想你可以提供你关心的所有目录,包括当前目录和历史目录

我想您可以测试git upstream推荐使用的filter repo,而不是filter branch。您可以在其中指定多个文件夹。。。。我想你可以提供你关心的所有目录,包括当前目录和历史目录

git筛选器分支也有一个

如文件所述:

这是用于重写索引的筛选器。它类似于树过滤器,但不签出树,这使其速度更快

正如文档中仍然指出的那样:您可能希望将它与git rm-cached[所有与您的筛选器不匹配的文件]一起使用。

git筛选器分支也有一个

如文件所述:

这是用于重写索引的筛选器。它类似于树过滤器,但不签出树,这使其速度更快


正如文档中仍然指出的那样:您可能希望将它与git rm-cached[所有与您的过滤器不匹配的文件]一起使用。

Nice!git筛选器分支-索引筛选器'fd-E 3166-X git rm-r-cached-ignore unmatch'头的速度大约是10倍。实际上应该是git筛选器分支-索引筛选器'fd-E 3166 | xargs rm-r-cached-ignore unmatch'头,以避免在执行命令时出现问题:参数列表太长。只是它不会影响任何东西。它可以与给定一组文件,但是fd/find在这种情况下很有用,应该使用git-ls文件。正在尝试git筛选器分支-删除空-索引筛选器git ls文件-':!:*3166*'| xargs git rm-f,但是嵌套的单个错误行为,整个事情变得相当复杂。您可以使用专用脚本来应用您的actionsNice!git筛选器分支-索引筛选器'fd-E 3166-X git rm-r-cached-ignore unmatch'头的速度大约是10倍。实际上应该是git筛选器分支-索引筛选器'fd-E 3166 | xargs rm-r-cached-ignore unmatch'头,以避免在执行命令时出现问题:参数列表太长。只是它不会影响任何东西。它可以与给定一组文件,但是fd/find在这种情况下很有用,应该使用git-ls文件。正在尝试git筛选器分支-删除空-索引筛选器git ls文件-':!:*3166*“| xargs git rm-f现在,但是嵌套的单个错误行为,整个事情变得相当复杂。您可以使用专用脚本应用您的操作git filter repo-force-path glob”*3166*。作为参考。一句预防措施-如果出现问题,reflog不会有帮助,一切都是从头重写的。好的。。。这是一个有趣的评论。旧的reflog被丢弃了?:-哎呀。连同所有的分支。git filter repo-force-path glob“*3166*”仅供参考。一句预防性的话-如果出现问题,reflog将无济于事,一切都将从头重写。好的。。。这是一个有趣的评论。旧的reflog被丢弃了?:-哎呀。连同所有的树枝。