处理大型Git项目的子树

时间:2017-06-23 04:22:31

标签: git github

我想对the FreeBSD repository的子集做一些工作。问题:这个存储库非常大; git clone拉近2 GB。我只需要一小部分用于我想做的事情;目前,大约140 KB。

我希望能够从上游获取更改(我真的不需要应用补丁),但我估计我有可能需要回到0%。

似乎我拒绝的每一条路都是死路一条:

  • 如果我使用--depth 1克隆上游回购,我无法将其推送到Github。 (“不允许浅更新”.Ubuntu 16.04上的Git 2.7.4)
  • 即使我git rm我不想要的一切(在工作目录中仅留下140KB)然后clone --single-branch,它也会下降1.5 GB。我想知道是否可能只是包装很糟糕并且有很多“错误共享”,但我尝试重新包装(-a -d -f --depth=250 --window=250,根据我看到的一些随机命令),它仍然是~880 MB之后。如果我再次克隆它,也一样。
  • 我尝试了git gc而且只是做了很多,更糟糕的事情(6.6 GB)。
  • 我可以filter-branch远离不必要的东西,但是如果我这样做的话,我似乎无法继续拉。

是否有一些工作流可以在这里工作,或者我应该只是切断与上游的连接,filter-branch所有的东西,然后只是拉入补丁,因为有新的提交上游?我应该忘记FreeBSD Github镜像并以某种方式使用git-svn制作回购? (最终,我想要的一切都不会包含在一个目录中;即,我需要foo/barfoo/baz,而不是foo/qux。)

(获取和应用这些补丁的最佳方式是什么?)

2 个答案:

答案 0 :(得分:1)

  

即使我把所有我不想要的东西(在工作目录中留下140KB)然后克隆--single-branch,它也会降低1.5 GB

是的,Git无论如何都会下载(获取)所有回购,但仅限于第一次推送 但这不应该阻止你推迟,如果你提交的范围有限(修改一些文件,那推送应该没有问题)

为了在本地限制工作树,你可以做的是一个稀疏的结账(首先它仍然需要完整的提取,但不会检查所有内容)。
您可以在" git clone is not cloning recent version of a certain repository?"

中看到稀疏克隆的示例

答案 1 :(得分:1)

有迹象表明未来的git版本会支持它。补丁已被接受。搜索OPT_PARSE_LIST_OBJECTS_FILTERadd object filtering for partial fetch