【发布时间】:2013-07-02 11:43:06
【问题描述】:
由于历史上包含二进制测试文件和 java .jar 文件,我们有许多 git 存储库已增长到无法管理的大小。
我们即将完成git filter-branching 这些存储库的练习,在使用它们的任何地方重新克隆它们(每个部署从几十个到数百个,具体取决于存储库)并给出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 的 git-bigfiles 分支,因为我们是 Eclipse shop 并且混合使用了 git 和 EGit。它看起来不像 git-media 或 git-fat 可以做我想要的,因为虽然你可以用外部等价物替换现有的大文件,但你仍然会需要重写历史以删除已经提交的大文件。
那么,是否可以在不重写历史记录的情况下精简 .git 存储库,或者我们是否应该回到使用 git filter-branch 的计划并进行大量重新部署?
顺便说一句,相信这应该是可能的,但可能与gits 当前shallow clone 实现的限制相同。
Git 已经支持同一个 blob 的多个可能位置,因为任何给定的 blob 都可能在 loose object store (.git/objects) 或 pack file (.git/objects) 中,所以理论上你只需要类似的东西git-annex 被挂在那个级别而不是更高级别(即,如果您愿意,可以考虑按需下载远程 blob)。不幸的是,我找不到任何人实施甚至提出过类似的建议。
【问题讨论】:
-
据我所知,你问的是如何在不重写历史的情况下重写历史。
-
@alternative 不完全是,我在问是否有办法在不重写历史的情况下精简存储库。目前看起来使用 shallow clones 可能是唯一的方法,但是这些限制可能不适用于我们的工作流程,即使这样做了,它们也只会缩小本地(克隆)存储库,而不是远程裸仓库。
-
“精简”存储库的唯一方法是删除您正在精简的内容 - 因此,重写(这就是为什么每个答案都说这是不可能的)。只要你做得正确,重写历史真的没有任何问题。是的,浅层克隆只会影响本地存储库。
-
@alternative - 如果您在一个小团队中工作并且外部合作者很少(github 上的分支),那么重写历史并不是什么大问题。如果您有数十名开发人员、合作者甚至更多克隆人,那么强制所有这些 ref 更新的成本可能会迅速失控。
标签: git egit large-files jgit git-filter-branch