编写我自己的文件版本控制程序

use*_*593 16 version-control

似乎有很多版本控制系统.因此,要得出一个糟糕的结论,一定要写一个很容易.

为编写简单的文件版本控制系统,必须考虑哪些问题?(最低必要功能是什么?)

这对一个人来说是一项可行的任务吗?

Bil*_*ard 21

了解版本控制的好地方是Eric Sink的Weblog.他的最新文章是版本控制存储中的时间和空间权衡,举个例子.

另一个很好的例子是他的一系列文章Source Control HOWTO.是的,这都是关于如何使用源代码控制的,但它有很多关于开发人员在设计系统时必须做出的决策和权衡的信息.最好的例子可能是他关于存储库的文章,他解释了存储版本的不同方法.我从这个系列中学到了很多东西.


dbr*_*dbr 10

怎么简单?

您可以使用单行shell脚本upversion.sh编写版本控制系统:

cp $WORKING_COPY $REPO/$(date +"%s")
Run Code Online (Sandbox Code Playgroud)

对于大型二进制资产,基本上就是您所需要的!它可以很容易地改进,比如将版本文件夹设置为只读,也许记录每个版本的元数据(例如,你可以有一个文本文件$REPO/$(date...).meta)

这听起来像是一个巨大的简化,但它与许多电影后期制作设施使用的资产管理系统并不相同(例如)

你真的需要知道你想要什么版本,为什么..

对于大型二进制资产(例如视频),您需要专注于可视化比较版本的工具.你也可能需要处理依赖性("我需要image123.jpg和video321.avi来生成这个图像")

使用代码,您需要专注于在任何两个版本之间制作差异非常简单的事情.此外,由于对源代码的编辑通常很小(来自具有数千行的项目中的几个字符),因此复制每个版本的整个项目将非常低效 - 因此您只存储每个版本之间的差异(delta编码).

要对数据库进行版本控制,您可能希望存储有关模式的信息,跟踪新表或列,或者对现有数据库进行调整(而不是计算数据库文件的增量,或者像前两个系统一样制作副本)

没有完美的方式来版本化所有,你必须专注于做好一件事.Git非常适合文本,但不适用于二进制文件.Adobe Version Cue非常适合使用二进制文件(图像),但对文本无用.

我想要考虑的事情可以概括为......

  • 你想要什么版本?
  • 为什么我不能使用(或扩展/修改)现有系统?
  • 如何跟踪版本之间的差异?(整个文件?deltas?)
  • 我需要将哪些其他数据附加到版本?(作者?时间戳?依赖?)
  • 用户通常需要做什么任务(差异化?还原特定文件?)


Von*_*onC 6

看看关于(D)VCS 的问题" 核心概念 ".
简而言之,编写VCS将涉及对每个核心概念做出决策(中央与分布式,线性与DAG,以文件为中心与以存储库为中心,......)

我认为不是"快速"项目;)


Kur*_*out 5

如果您是Linus Torvalds,则可以在一个月内编写类似Git的内容。

但是“版本控制系统”是一个模糊且可扩展的概念,您的问题确实无法回答。

我会考虑问自己想要实现的目标(了解VCS,学习语言,...),然后定义一些明确的目标。有一个项目很好,但是在短时间内有一个可实现的目标也很好。小小的成功对你的士气有好处。

  • 我会说:“如果您是Linus Torvalds,您可以吸引其他程序员,这样他们就可以在一个月内编写您想要的程序” (3认同)
  • 请注意,Linus Torvalds a.) 广泛使用 BitKeeper,因此他知道他想要从分布式版本控制系统中得到什么 b.) 从其他 SCM 中汲取灵感,例如来自 Monotone 的 SHA-1 内容(至少对于 Linux 内核来说太慢了)当时)。另外,这个月是创建简单的 git-core 管道所花费的时间,它是 SCM 的基础,而不是凡人可以使用的东西。自第一个版本发布以来已有 4 年了,Git 正在不断改进。 (2认同)

Ala*_*avi 2

良好的delta算法,良好的压缩和网络效率。