版本控制软件比较

以下是**版本控制软件比较**。下表包括知名的版本控制和软件配置管理（SCM）软件的一般信息和技术信息。对不适用源代码的SCM软件，见。

## 一般信息

**表格说明**
* *库模式*表示源码库各个副本之间的关系。在一个主从式架构中，用户通过客户端访问总库；一般而言，他们本地机器只保存项目树的一个工作副本。工作副本的变化必须提交到总库之后才能反映给其他用户。而在分布式架构中，库之间是平等的，用户一般除了他们的工作副本之外，还有本地库来存放版本历史。
* *并发模式*表示如何管理工作副本的变化，以防止同时编辑造成库中的数据混乱。在*锁定*模式下，只有用户从总库请求并得到了一个文件的排他锁，才允许改变文件。在*合并*模式下，用户可以自由编辑文件，但当他们提交变化到总库时会被告知可能存在冲突，随后版本控制系统可能会对双方合并这些变化，或者当发生冲突时让用户来决定。注意，分布式版本控制几乎都是合并的并发模式。

## 技术信息

**表格说明**
* *软件*：应用的名称。
* *编程语言*：编程语言中的应用正在发展
* *存储方法*：表示文件在库中存储的形式。*快照*表示提交的文件被整个存储——通常是压缩的。*变化集*表示提交的文件只存储它与前后版本的区别。
* *变化范围*：表示记录的变化是针对单独的*文件*，还是整个目录*树*。
* *<span id="Revision IDs">版本ID</span>*：用来在库中标识文件的特定版本。系统可以使用*[[伪随机性|伪随机]]*标识符、版本的内容散列值或带有版本序列号（命名空间）的文件名。而Integrated Difference的版本号则基于变化集自身，它可以表示多个文件的变化。
* *网络协议*：同步变化时所使用的协议列表。
* *源码规模*：源码的大小以兆（megabyte）为单位。

## 功能

**表格说明**
* *软件*：应用的名称。
* *原子提交*：保证所有的改变都提交成功或者都不成功。
* *文件重命名*：表示系统是否允许文件在改名后仍然保留他们的版本历史。
* *合并文件重命名*：表示系统是否能够将一个分支上的文件变化合并到另一个分支上已重命名的同一个文件上（或者相反）。 如果同一个文件在两个分支上都已经重命名，则产生重命名冲突，必须由用户来解决。
* *[[符号链接]]*：表示一个系统是否允许象普通文件一样对符号链接进行版本控制。 对符号链接的版本控制，某些人认为是一项功能，而另一些人则认为存在安全隐患（例如，一个到/etc/passwd的符号链接）。符号链接只支持特定的平台，这取决于软件的实现。
* *前/后事件触发*：表示有能力在一个动作之前或之后触发命令，例如发生一个提交的动作。
* *[[數位簽章|签名]]版本*：指集成了版本的数字签名，例如以OpenPGP的格式。
* *合并跟踪*：表示一个系统是否记得在哪些版本之间合并了哪些变化，并且只合并那些从一个分支合并到另一个分支时丢失的变化。
* *[[換行|换行]]转换*：表示一个系统是否能适配文本文件的换行符，从而匹配当前使用的操作系统的换行方式。控制变化的粒度，例如 Subversion，可以进行配置，依据文件类型来处理换行符的不同，而Perforce根据一个单一、每个客户端的配置转换所有的文本文件。
* *[[修订标签|标签]]*：表示是否可以给一个特定版本赋予一个带有含意的名字，无论这些名字被叫做标记还是标签。
* *国际化支持*：表示该软件是否支持多语言环境和多操作系统。
* *Unicode文件名支持*：表示该软件是否支持使用不同的文件系统之间的互操作。
* *大库支持*：系统能高效处理十亿字节左右或更大的库吗？

## 高级功能

**表格说明**
* *关键词扩展*：支持关键词自动扩展，例如文件版本号。
* *交互式提交*：交互式提交允许用户对变化精挑细选，并决定哪些变化可以提交（未被选择的变化只被保留为工作副本的变化），而不是只到文件级别的粒度。
* *外部引用*：在源码树中嵌入外部库。
* *部分检出/复制*：从库中只检出或复制特定子目录的能力。
* *权限位*：在版本历史中跟踪文件权限位。
* *保留时间戳*：对于文件系统属性中的*最后修改时间*，以提交时间覆盖检出时间。
* *用户自动合并工具*：自动合并可以尝试通过用户选择的任何工具来进行（希望能以每个文件为基础来配置）。
* *支持的格式*：支持读/写，或者只读（转换，有可能再重复）。
* *共享所得目标的构建缓存*：通过这一能力，如果其他协作用户恰好共享了同样的依赖，可以引入其他用户构建的所得目标，而无需在本地重建它们。

## 基本命令

**表格说明**
* 绿格中不在[方括号]里的命令使用了交互式的命令行提示符。[方括号]中的文本用来解释哪里能找到等价功能。
* *库初始化*：创建一个新的空库（比如，版本控制数据库）。
* *克隆*：创建一个完全相同的库实例（在一个安全事务中）。
* *拉*：将版本从远程库下载到本地库。
* *推*：将版本从本地库上传到远程库。
* *本地分支*：创建一个不存在于原始远程库中的本地分支。
* *检出*：从（远程）库创建一个本地工作副本。
* *更新*：用库中的最新版本更新工作副本中的文件。
* *锁定*：锁定库中的文件，以免被其他用户更改。
* *添加*：标记指定的文件，以便在下一次提交时添加到库中。
* *移除*：标记指定的文件，以便在下一次提交时移除（注：保存在移除时及之前的相关版本历史）。
* *移动*：标记指定的文件，以便在下一次提交时移动到新的位置。
* *拷贝*：标记指定的文件，以便在下一次提交时拷贝。
* *合并*：融合同一个工作副本路径的两个来源之间的差别。
* *提交*：将变化记录到库中。
* *恢复*：从库中恢复工作副本文件。
* *生成打包文件*：创建一个包含压缩的对给定库的变化集的文件。
* *重定位*：将本地提交重定位到已更新的上游地址。

## 高级命令

**表格说明**
* 绿格中不在[方括号]里的命令使用了交互式的命令行提示符。[方括号]中的文本用来解释哪里能找到等价功能。
* *命令别名*：为指定的命令或组合创建定制的别名
* *锁定/解锁*：排他性地锁定一个文件，以防被其他人编辑。
* *搁置/取消搁置*：在工作目录中暂时搁置部分或全部的变化。
* *回滚*：从历史中移除一个版本。
* *挑选*：只把某些修订从一个分支移动到另一个分支（而不是合并分支）。
* *二分检索*：在源码历史中，使用二分检索来查找一个变化的引入或修复。
* *出入*：查询本地库和远程库之间的差别（该差别可能会以推/拉的方式发送/取回）。
* *过滤*：在库中搜索，以找到那些匹配一个模式的行。
* *记录*：在一次提交中只包含一个文件的某些变化，而不包含其它的变化。

## 用户界面

**表格说明**
* *软件*：应用的名称。
* *网页版界面*：表示应用软件是否包含一个网页版界面。网页版界面可以允许软件发送诊断数据到一个网站，甚至能允许对应用软件进行远程控制。
* *图形界面*：GUI，图形用户界面。 如果一个软件产品提供了GUI，它的功能可以通过应用程序窗口来访问，而不是只能通过象DOS界面一样在命令提示符后面敲入命令来访问。
* *插件*：功能通过集成开发环境来实现。 最低的功能应该是，列出文件的版本状态，及检入/检出文件。

## 历史及用户

**表格说明**
* *软件*：应用的名称。
* *历史*：简短地讲述软件的起源好发展。
* *知名用户*：使用该软件作为*主要*版本控制系统的知名工程列表，不包括该软件自己。如果它有一个完整的列表，后边会列出该列表的链接。

## 参见
* 版本控制软件列表
* 自由软件托管服务比较

## 注释

## 参考文献