git
仓库,由于历史上包含二进制测试文件和Java .jar
文件而变得难以管理。我们即将进行
git filter-branch
操作,重新克隆它们到每个使用它们的地方(根据仓库的不同,从几十个到数百个部署),但由于重写历史的问题,我想知道是否还有其他解决方案。理想情况下,我希望在不重写每个仓库的历史记录的情况下外部化问题文件。从理论上讲,这应该是可能的,因为您正在检出相同的文件,具有相同的大小和哈希值,只是从不同的位置获取它们(一个远程位置而不是本地对象存储)。然而,到目前为止,我发现的潜在解决方案似乎都无法做到这一点。
从git-annex开始,我能找到的最接近解决我的问题的方法是如何在已经存在于git仓库中的文件上进行后期附加, 但和删除大文件一样,这需要重写历史记录以将原始的git add
转换为git annex add
。
接着,我开始寻找git-annex项目列表中的其他项目,因此我检查了git-bigfiles, git-media和git-fat。不幸的是,由于我们是Eclipse商店,并且使用混合的git
和EGit,我们无法使用git-bigfiles分支。看起来git-media或git-fat也不能满足我的要求,因为虽然你可以用外部文件替换现有的大文件,但你仍需要重写历史记录以删除已经提交的大文件。
那么,是否有可能在不重写历史记录的情况下精简 .git 存储库,或者我们应该回到使用 git filter-branch
和大量重新部署的计划?
作为旁注,认为这应该是可能的,但可能与git当前的shallow clone实现有相同的限制。
Git已经支持同一blob的多个可能位置,因为任何给定的blob都可以在loose object store(.git / objects)或pack file(.git / objects)中,因此从理论上讲,只需要像
git-annex 这样的东西挂钩在那个层面,而不是更高层次(即如果您喜欢,具有按需下载的概念远程blob)。不幸的是,我找不到任何人已经实现或甚至建议过类似这样的东西。