Weave合并算法

http://wiki.bazaar.canonical.com/BzrWeaveFormat

什么是Weave?

Weave是一种存储一个文件所有修订版本的方法。它是一种增量比较的方式,所以是更加有效率的存储方式。Weave被计划作为brz的新的后端存储方式。Weave是一种比较经典的方式了,它在SCCS中第一次被应用,后来BitKeeper也使用Weave。(SCCS weaves会存储更多的数据,但其中额外加的数据和核心的weave概念并没有太大的关系)。

Weave的工作方式时通过记录文件中出现过的每一行内容,按照一定的方式排序,并且保存每个修订版本的元数据信息,比如哪一行是版本a新增的哪一行是版本b删除的。因为文件内容以及排好序了,提取修订信息仅仅是在适当的行上切换的问题。每一行由添加该行的修订及其在该修订中的位置唯一标识。具有相同内容的两行被视为不同的行,因为它们处于不同的位置或被添加到不同的修订版中。有了逐行元数据,可以轻松进行“注释”或“合并”操作。

例子:


花括号标识插入,方括号标记删除。 请注意,插入总是始终正确嵌套(LIFO),但是删除可能会彼此重叠,也可能与插入重叠

Weave merge:Why and How

SCMs常用的合并算法是三路合并,但是它也有缺陷。三路合并不能很好的配合cherry pick使用,或者当两个人同时合并对方的内容也会出现问题。Weave合并不需要文件的三个版本,因此它们没有这些限制。 大致说来,它通过:

1.记录任一修订版本添加的所有行。2.记录任一修订版本删除的所有行

这些操作是顺序的,因此在任一修订版中删除的行将永远不会出现在结果中。之所以可行,是因为每一行都是不同的,无论其内容是什么。更详细的说明,见Precise Codeville Merge

这是上述示例的计划合并运算符的输出:


我们还需要标记冲突区域以引起用户注意。 这种情况在相互不变的线之间确实存在冲突。支持编织合并的愿望促使我们使用编织而不是其他增量压缩格式。

编织合并的缺点

编织的当前实现方式允许随时重写文件的任何部分。这意味着将它们与标准网络协议一起使用需要在每次更新时重新下载整个编织。但是,编织通常较小(压缩编织可以小于原始编织),并且宽带连接应该能够快速交付它们。另一个缺点是,编织文件的大小与对该文件进行的更改量成正比。 对于历史悠久的项目,人们可能会希望这会过慢,但事实并非如此。 例如,可以在0.2秒内提取gcc项目的CHANGELOG(具有1112个修订版)。通过使用更复杂的仅附加编织格式,可以避免这两个缺点。 目前尚不清楚它们是否值得,因为预计不利的情况不会很严重。

总的来说,weave的优点是:

1.快速注释和编织合并。2.同样很好地支持常规三向合并。3.由于我们每次都重写存储文件,因此我们可以将其压缩到一个gzip历史记录中,从而获得很好的压缩效果。4.非常紧凑。

缺点:

1.当前实现每次都会重写存储文件。2.由于要重写同一文件,因此损坏将破坏所有较早的历史记录。3.必须重新读取整个历史记录以提取任一版本。 但是,对于特殊情况,例如清单文件,我们不关心注释或文本合并,可以使用其他格式,也可以将组织划分为多个文件。

你可能感兴趣的:(Weave合并算法)