版本控制系统如何快速生成历史悠久的原始文件?

Posted

技术标签:

【中文标题】版本控制系统如何快速生成历史悠久的原始文件?【英文标题】:How do version control systems generate original file with a long history so fast? 【发布时间】:2020-01-20 15:16:05 【问题描述】:

我正在用 java 开发一个简单的文本文件版本控制系统。当使用 commit 命令时,我计算最新版本和最后提交的版本之间的差异并存储它。我已经编写了代码来制作差异文件并重新生成原始文件。问题在这里,我觉得对于非常大的提交历史,我将不得不重新创建最后提交的版本,然后使用 diff。当我签出文件的先前版本时也会出现这种情况。所以使用我的算法我将不得不使用我的第一个提交(它具有所有原始数据而不是差异),然后继续为下一个差异应用重新生成算法。这需要很长时间。我期待着让它更快更高效。你能告诉我该怎么做吗?

也不是所有的 diff 都按照指定的顺序计算。也就是说,如果我有两个文件,file1file2,我会这样计算 diff:diff(file1, file2);diff(file2, file1);。而且我只保留较小的文件。另一个文件,我删除它。我想知道这是否是一个好方法?

我只需要一些方法来解决这个问题。不是源代码。

【问题讨论】:

【参考方案1】:

假设您有一个巨大的文件,有 10000 行,并且您对该文件有很多提交。

如果您想要返回/转发多个提交,则不应将每个提交都应用到大文件。相反,从第一次提交开始,使用行号创建一个差异文件。因为当第一次提交添加第 X 行时,第二次提交可能会删除第 X 行。这样您就不必处理文件两次。如果您只保留带有行号的差异文件,则在最后一次提交时您可以开始应用差异。

您可以在此基础上进行各种优化,但根据您的解释,最重要的是不重新创建文件。

【讨论】:

好的,所以我创建了这些差异文件的差异文件。是的,我认为这会奏效。谢谢。

以上是关于版本控制系统如何快速生成历史悠久的原始文件?的主要内容,如果未能解决你的问题,请参考以下文章

版本控制工具GIT使用指南

软件构造(转)Git详解常用操作与版本图

Git 常用命令整理

Git 分支提交等基础运用

PHPWAMP快速自定义Mysql历史版本,吸纳其他集成环境的Mysql数据库

如何轻松合并两个源文件?