现在,相同的“巨大”文件驻留在服务器上开发人员的两个分支中。它不会自动创建硬链接
实际上,在 Git 2.20 中,这个问题可能会消失,因为delta Islands是一种进行 delta 计算的新方法,因此存在于一个分叉中的对象不会与不出现在同一个分叉存储库中的另一个对象形成增量.
请参阅Christian Couder ( ) 的提交 fe0ac2f、提交 108f530、提交 f64ba53(2018 年 8 月 16 日)。
帮助者:Jeff King ( )和Duy Nguyen ( )。
请参阅Jeff King ( )的提交 9eb0986、提交 16d75fa、提交 28b8a73、提交 c8d521f(2018 年 8 月 16 日) 。
帮助者:Jeff King ( )和Duy Nguyen ( )。(由Junio C Hamano 合并 -- --在提交 f3504eachriscool
peff
pclouds
peff
peff
pclouds
gitster
, 2018 年 9 月 17 日)
添加delta-islands.{c,h}
允许用户“分叉”现有存储库的托管服务提供商希望这些分叉共享尽可能多的磁盘空间。
替代方案是一种现有的解决方案,可以将所有分叉中的所有对象保存到一个唯一的中央存储库中,但这可能有一些缺点。
特别是在打包中央存储库时,将在来自不同分支的对象之间创建增量。
这会使克隆或获取分叉变得更慢且 CPU 密集度更高,因为 Git 可能必须为许多对象计算新的增量以避免从不同的分叉发送对象。
因为效率低下主要出现在一个对象与另一个不存在于同一个分叉中的对象之间进行区分时,我们将对象划分为出现在同一个分叉中的集合,并定义“增量岛”。
在查找 delta base 时,我们不允许将同一岛之外的对象视为其基础。
所以“增量岛”是一种将来自不同分支的对象存储在同一个存储库和包文件中的方法,而不会在来自不同分支的对象之间存在增量。
该补丁实现了“ delta-islands.{c,h}
”中的 delta 孤岛机制,但尚未使用它。
struct object_entry
不过,在“”中的“ ”中添加了一些新字段pack-objects.h
。
见Documentation/git-pack-objects.txt
:三角洲岛:
三角洲群岛
在可能的情况下,pack-objects
尝试重用现有的磁盘增量,以避免不得不即时搜索新的增量。这是服务获取的重要优化,因为这意味着服务器可以完全避免膨胀大多数对象,而直接从磁盘发送字节。
当一个对象被存储为一个接收者没有的基础(并且我们还没有发送)的增量时,这种优化就不起作用了。在这种情况下,服务器会“破坏”增量并必须找到一个新的增量,这具有很高的 CPU 成本。因此,磁盘上增量关系中的对象集与客户端将获取的对象匹配对于性能很重要。
在普通存储库中,这往往会自动工作。
这些对象大多可以从分支和标签中访问,这就是客户端获取的内容。我们在服务器上发现的任何增量都可能位于客户端拥有或将拥有的对象之间。
但是在某些存储库设置中,您可能有几个相关但独立的参考提示组,客户端倾向于独立获取这些组。
例如,假设您在单个共享对象存储中托管存储库的多个“分支”,并让客户端通过 GIT_NAMESPACE 将它们视为单独的存储库或使用替代机制的单独存储库。
天真的重新打包可能会发现对象的最佳增量是针对仅在另一个分叉中找到的基础。
但是当客户端获取时,他们将没有基础对象,我们必须在运行中找到一个新的增量。
如果您在外部有许多引用refs/heads/
并且refs/tags/
指向相关对象(例如,refs/pull
或被refs/changes
某些托管服务提供商使用),则可能存在类似的情况。默认情况下,客户端仅获取头和标签,并且无法按原样发送仅在其他组中找到的对象的增量。
Delta 岛通过允许您将 ref 分组到不同的“岛”来解决这个问题。
Pack-objects 计算哪些对象可以从哪些岛屿到达,并拒绝从一个对象A
与一个不存在于所有A
岛屿中的基础进行增量。这会导致包稍微大一些(因为我们错过了一些 delta 机会),但保证了一个岛的获取不会由于跨越岛边界而不得不在运行中重新计算 delta。
但是有一个副作用:一些命令更加冗长。Git 2.23(2019 年第三季度)修复了这个问题。
请参阅Jeff King ( ) 的提交 bdbdf42(2019 年 6 月 20 日)。(由Junio C Hamano 合并 -- --在提交 a4c8352中,2019 年 7 月 9 日)peff
gitster
delta-islands
: 尊重progress
国旗
delta island 代码总是打印“ Marked %d islands
”,即使进度已被--no-progress
或通过将 stderr 发送到非 tty 来抑制。
让我们将progress
布尔值传递给load_delta_islands()
.
我们已经为进度表做了同样的事情resolve_tree_islands()
。