首页 > 解决方案 > 了解 Git:捆绑与克隆

问题描述

我使用 --mirror 克隆了我的遥控器:

git clone --mirror git-user@git-url.example.com:my-repo-name.git

然后我在 repo 上工作以删除 repo 中的一些大文件和一些不需要的分支。整体回购规模减少了约 10%。

我制作了一堆这个尺寸缩小的 repo 打算推送它。然后我测试恢复了这个捆绑包,看看它是什么样子的。

git clone my-repo-name.bdl my-repo-name 

恢复的捆绑包小了大约 75%,但它包含所有分支、标签等,并且似乎有我想要的完整历史记录。我应该相信我被告知的这种“归档”方法吗?大幅减小的文件大小让我担心这是不正确的。恢复的捆绑包可能遗漏了什么?

标签: git

解决方案


捆绑包的主要目的是将更改传达给您无法推送(或无法从您那里获取)的存储库,例如由于缺乏网络访问权限。但是,它们可以用于许多其他事情。

当您清理原始存储库时,您采取了哪些步骤来确保真正从存储库中清除删除的项目?由于您的尺寸有所减小,我假设您跑了git gc;但是您是否确保首先清除所有 reflog,以及所有可能仍指向不需要的历史记录的 ref?旧的 repo 可能仍然有一堆你删除的东西的历史记录,这可能是差异的原因。

也就是说,由于您的捆绑包没有引用日志并且不会包含“奇怪的”引用 - 可能是由创建的备份引用filter-branch- 它更有可能是您放入其中的引用的真正最小历史;另外,重新包装可能会节省一些空间。(通常可以通过克隆清理后的存储库来进行类似的清理。)

如果将 ref 写入捆绑包,并且您可以将捆绑包应用到空 repo,那么您可以放心,该 rep 的完整历史记录(包括每个提交点的目录结构和文件内容)都存在。如果这不占回购所需大小的大部分,那将是非常令人惊讶的。

如果历史记录以某种方式损坏并丢失了数据,那么 git 应该抱怨它;但是如果您担心,也许git fsck在您应用了该捆绑包的存储库上会提供一些额外的保证。

可能缺少什么?好吧,你没有捆绑的裁判。所以:无法从任何分支访问的标签。Notes refs 可能(如果你使用它们)。替换 refs 可能(如果你使用它们)。远程参考,我猜,但如果你正在重写你可能不想要它们。或者,如果您在创建捆绑包时给出的分支列表太窄。我不能说这份清单是详尽无遗的。一般来说,就像我说的,“其他参考”。您可以git for-each-ref在新旧存储库中运行并比较结果以查看新存储库中没有的内容(如果有的话)。

可以捆绑一个“浅”的历史,但你必须指定你想要它,而且它不会轻易地应用于一个空的回购。因此,如果这不是您想要做的,那可能不是发生的事情。


推荐阅读