理解Git:Bundle vs Clone

时间:2018-05-03 16:12:25

标签: git

我使用--mirror:

克隆了我的遥控器
git clone --mirror git-user@git-url.example.com:my-repo-name.git

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

我制作了这个缩小尺寸的回购包,打算推动它。然后我测试恢复了这个包,看看它是什么样的。

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

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

1 个答案:

答案 0 :(得分:1)

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

当您清理原始仓库时,您采取了哪些措施来确保从仓库中清除已移除的物品?由于你的缩小了一些,我假设你运行了git gc;但是你是否确保首先清除任何reflog,以及所有 refs仍然可能指向不需要的历史记录?对于您删除的内容,旧的回购邮件可能仍然有很多历史记录,这可能是造成差异的原因。

也就是说,因为你的捆绑包没有获得reflogs并且不会包含"怪异的" refs - 比如filter-branch创建的备份引用 - 它更可能是你输入的引用的真正最小历史记录;加上重新包装可以节省一些空间。 (通常可以通过克隆清理后的仓库来进行类似的清理。)

如果将ref写入bundle,并且你可以将bundle应用于空repo,那么你可以放心,该rep的完整历史记录(包括每个提交点的目录结构和文件内容)是当下。如果没有考虑到回购所需大小的大部分,那将是非常令人惊讶的。

如果历史记录有点腐败和缺失数据,git应该抱怨它;但是,如果您担心,可能git fsck对您已应用该套装的回购邮件提供了额外的保证。

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

可以也捆绑了一个"浅"历史,但你必须指明你想要它,它不会轻易应用于空的回购。所以如果那不是你想要做的事情,那可能不是发生了什么。