【问题标题】:Algorithm for Source Control System?源代码控制系统的算法?
【发布时间】:2010-04-18 04:54:38
【问题描述】:

我需要编写一个简单的源代码控制系统,想知道我将使用什么算法来处理文件差异?

出于许可问题,我不想查看现有源代码。我需要在 MPL 下获得许可,因此我无法查看任何现有系统,例如 CVS 或 Mercurial,因为它们都是 GPL 许可的。

只是提供一些背景知识,我只需要一些非常简单的功能 - 文件夹中的二进制文件。没有子文件夹,每个文件的行为都像它自己的存储库。除某些权限外,没有元数据。

总体上非常简单的东西,我唯一关心的是如何只存储文件从修订到修订的差异,而不会浪费太多空间,而且效率也不会太低(也许每次 X 更改存储一个完整版本,有点像视频中的关键帧?)

【问题讨论】:

    标签: c# .net algorithm version-control


    【解决方案1】:

    最长公共子序列算法是 diff 类工具使用的主要机制,并且可以被源代码控制系统利用。

    “反向增量”是一种常用的存储方法,因为您主要需要从最近的修订版本向后移动。

    【讨论】:

    • 嗯,我更喜欢你的回答。你实际上知道你在说什么,看起来。 :-P
    【解决方案2】:

    Patience Diff 是一种很好的算法,用于查找两个文件之间可能对人们有意义的增量。这通常比简单的“最长公共子序列”算法提供更好的结果,但结果是主观的。

    话虽如此,许多现代修订控制系统在每个阶段都存储完整的文件,并在以后仅在需要时计算实际差异。对于二进制文件(可能不太容易压缩),您可能会发现存储反向增量最终可能更有效。

    【讨论】:

    • 这很酷。仍然是 LCS 算法系列的一个变体,但它是一个非常好的改进。
    【解决方案3】:

    看看Subversion的源码怎么样?它在 Apache License 2.0 下获得许可

    【讨论】:

    • 谢谢。必须检查 Apache 和 MPL 是否兼容,但看起来是这样。
    【解决方案4】:

    Gene Myers 写了一篇很好的论文An O(ND) Difference Algorithm and its Variations。在比较序列时,迈尔斯是最合适的人。您可能还应该阅读 Walter Tichy 关于 RCS 的论文;它解释了如何通过存储最新版本和差异来存储一组文件。

    【讨论】:

      【解决方案5】:

      存储增量(向前或向后)的想法在版本控制方面是经典的。问题一直是,“你存储什么增量?”

      许多源代码控制系统存储的增量基本上是由“差异”计算的,例如最长公共子序列的面向行的补码。但是您可以以特定于这些文档的方式计算特定类型文档的增量,以获得更小(并且通常更易于理解)的增量。

      对于编程语言源代码,可以计算程序结构上的 Levenshtein 距离。可以在Smart Differencer

      找到一组工具,这些工具基本上可以针对各种流行的编程语言执行此操作

      如果您要存储非文本文件,则可以利用它们的结构来计算更小的增量。

      当然,如果您想要的是一个最小的实现,那么只需存储每个文件版本的完整图像就很容易了。太字节的磁盘使该解决方案即使不是很漂亮也可以使用。 (PDP10 文件系统曾经隐式执行此操作)。

      【讨论】:

        【解决方案6】:

        虽然fossil是GPL,但delta算法是基于rsync的,描述here

        【讨论】:

          【解决方案7】:

          前几天我实际上正在考虑类似的事情......(奇怪,是吗?)

          我没有给你一个很好的答案,但我确实得出结论,如果我要编写一个文件差异工具,我会使用一种算法(用于查找差异),它的功能有点像 REGEXes用他们的贪婪来运作。

          至于存储 DIFF...如果我是你,而不是存储前向 DIFF(即,您从原始文件开始,然后在使用版本 151 时计算机 150 对其进行差异),使用存储的 DIFF为您的历史记录,但将您的最新文件存储为完整版本。如果您这样做,那么无论何时处理最新文件(可能是 99% 的时间),您都会获得最佳性能。

          【讨论】:

            猜你喜欢
            • 2021-09-17
            • 2011-07-01
            • 1970-01-01
            • 2017-08-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多