我们有多个git
存储库,由于二进制测试文件和java文件的历史包含,这些存储库已经发展到难以管理的大小。是否可以修改.git存储库而不重写历史记录?
我们即将完成这些存储库的练习,将它们重新克隆到它们使用的任何地方(从每次数十次到数百次,具体取决于回购)并给出problems with rewriting history我想知道是否存在可能是其他解决方案。
理想情况下,我想在不重写每个存储库的历史记录的情况下将问题文件外部化。理论上这应该是可能的,因为你正在检出相同的文件,具有相同的大小和相同的哈希,只是从不同的地方(远程而不是本地对象存储)获取它们。唉,迄今为止我找到的潜在解决方案似乎都不允许我这样做。
与git-annex开始,我能找到的最接近解决我的问题是How to retroactively annex a file already in a git repo,但与刚刚删除的大文件,这需要历史被重新写入原来git add
转换为git annex add
。
从那里开始,我开始考虑在what git-annex is not上列出的其他项目,所以我检查了git-bigfiles,git-media和git-fat。不幸的是,我们不能使用git-bigfiles分支git
因为我们是一个Eclipse 商店并且使用git
和EGit的混合物。它看起来并不像混帐媒体或混帐脂肪可以做我想做决定,因为当你可以与外部等同替换现有的大文件,你仍然需要改写历史,以去除大已经提交的文件。
那么,是否可以在不改写历史记录的情况下减少.git存储库,还是应该回到使用git filter-branch
以及整个重新部署的计划?
顺便说一句,相信这应该是可能的,但可能是依赖于相同的限制那些git
目前shallow clone实现。
的Git已经支持相同的blob多个可能的位置,因为任何给定的斑点可能是在loose object store(.git/objects
),或在一个pack file(git的/对象),所以理论上你只需要像在git-annex
而钩在那个级别而不是更高的级别(即如果你愿意,可以有一个下载点的概念远程blob)。不幸的是,我找不到任何人已经实施甚至提出这样的建议。
据我可以告诉你问如何在不重写历史的情况下重写历史。 – alternative
@alternative不完全,我问是否有一种方法可以在不重写历史记录的情况下减少资源库*。目前看起来像使用浅层克隆可能是唯一的方法,但是这些限制可能不适用于我们的工作流程,即使这样做,他们也只会减少本地(克隆)回购站点,而不是远程裸站回购。 –
“瘦”仓库的唯一方法是删除你瘦身的内容 - 因此,重写(这就是为什么每个答案都说这是不可能的)。只要你做得正确,就不会有重写历史的问题。是的,浅层克隆只会影响本地存储库。 – alternative