Git 从大型存储库中派生特定目录

Git 从大型存储库中派生特定目录,git,github,Git,Github,我想分叉一个巨大的存储库(10GB),将它过滤到一个特定的目录,并将过滤后的版本推送到一个新的Github存储库 我已经使用指令将其拉入并过滤到我的目录,这很有效。但当我试图将过滤后的回购协议推回到Github时,我得到了以下错误: $ git push origin master --force Enumerating objects: 2292154, done. Counting objects: 100% (2292154/2292154), done. Delta compressio

我想分叉一个巨大的存储库(10GB),将它过滤到一个特定的目录,并将过滤后的版本推送到一个新的Github存储库

我已经使用指令将其拉入并过滤到我的目录,这很有效。但当我试图将过滤后的回购协议推回到Github时,我得到了以下错误:

$ git push origin master --force
Enumerating objects: 2292154, done.
Counting objects: 100% (2292154/2292154), done.
Delta compression using up to 8 threads
Compressing objects: 100% (562030/562030), done.
error: RPC failed; curl 55 SSL_write() returned SYSCALL, errno = 32
fatal: the remote end hung up unexpectedly
Writing objects: 100% (2292154/2292154), 7.03 GiB | 40.92 MiB/s, done.
Total 2292154 (delta 1726549), reused 2292154 (delta 1726549)
fatal: the remote end hung up unexpectedly
Everything up-to-date
我已经尝试过提出的解决方案,但错误依然存在


有没有办法分叉一个特定的目录并减少总的回购大小以使其更易于管理?

鉴于您提供的链接,问题可能与提交的大小有关。也许只将您的回购过滤到此目录,但保持与之相关的提交会有所帮助

git过滤器分支
手册:

要重写存储库,使其看起来像foodir/是其项目根目录,并放弃所有其他历史记录,请执行以下操作:

git过滤器分支--子目录过滤器foodir--all

希望能有所帮助

要仅保留此目录(并将其保留在结构中),它稍微复杂一些

根据
git filter branch
manual中的示例,应该可以做到以下几点:

git filter-branch --index-filter \
   'git ls-files -s foodir/ |
       GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
       git update-index --index-info &&
       mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"
   ' -- --all
简而言之:
gitls files-sfoodir/
的输出仅显示foodir/中文件的索引内容(blobtree和filename);此文件列表将放回索引中


无论如何,正如我在评论中指出的,您不能简单地合并它,因为提交现在不同了。

谢谢!这很有效。有没有办法让我的目录保持在当前位置(而不是根目录)?这将使以后更容易合并回上游。您可以尝试使用
git filter branch--index filter
。对不起,时间太短了,等我有时间的时候再详细说明。请注意,git filter branch重写了历史记录,您将无法简单地将其合并到原始存储库中。