热门问题
时间线
聊天
视角
版本控制软件比较
维基媒体列表条目 来自维基百科,自由的百科全书
Remove ads
以下是版本控制软件比较。下表包括知名的版本控制和软件配置管理(SCM)软件的一般信息和技术信息。对不适用源代码的SCM软件,见开源配置管理软件比较。
一般信息
表格说明
- 库模式表示源码库各个副本之间的关系。在一个主从式架构中,用户通过客户端访问总库;一般而言,他们本地机器只保存项目树的一个工作副本。工作副本的变化必须提交到总库之后才能反映给其他用户。而在分布式架构中,库之间是平等的,用户一般除了他们的工作副本之外,还有本地库来存放版本历史。
- 并发模式表示如何管理工作副本的变化,以防止同时编辑造成库中的数据混乱。在锁定模式下,只有用户从总库请求并得到了一个文件的排他锁,才允许改变文件。在合并模式下,用户可以自由编辑文件,但当他们提交变化到总库时会被告知可能存在冲突,随后版本控制系统可能会对双方合并这些变化,或者当发生冲突时让用户来决定。注意,分布式版本控制几乎都是合并的并发模式。
Remove ads
技术信息
表格说明
- 软件:应用的名称。
- 编程语言:编程语言中的应用正在发展
- 存储方法:表示文件在库中存储的形式。快照表示提交的文件被整个存储——通常是压缩的。变化集表示提交的文件只存储它与前后版本的区别。
- 变化范围:表示记录的变化是针对单独的文件,还是整个目录树。
- 版本ID:用来在库中标识文件的特定版本。系统可以使用伪随机标识符、版本的内容散列值或带有版本序列号(命名空间)的文件名。而Integrated Difference的版本号则基于变化集自身,它可以表示多个文件的变化。
- 网络协议:同步变化时所使用的协议列表。
- 源码规模:源码的大小以兆(megabyte)为单位。
Remove ads
功能
表格说明
- 软件:应用的名称。
- 原子提交:保证所有的改变都提交成功或者都不成功。
- 文件重命名:表示系统是否允许文件在改名后仍然保留他们的版本历史。
- 合并文件重命名:表示系统是否能够将一个分支上的文件变化合并到另一个分支上已重命名的同一个文件上(或者相反)。 如果同一个文件在两个分支上都已经重命名,则产生重命名冲突,必须由用户来解决。
- 符号链接:表示一个系统是否允许象普通文件一样对符号链接进行版本控制。 对符号链接的版本控制,某些人认为是一项功能,而另一些人则认为存在安全隐患(例如,一个到/etc/passwd的符号链接)。符号链接只支持特定的平台,这取决于软件的实现。
- 前/后事件触发:表示有能力在一个动作之前或之后触发命令,例如发生一个提交的动作。
- 签名版本:指集成了版本的数字签名,例如以OpenPGP的格式。
- 合并跟踪:表示一个系统是否记得在哪些版本之间合并了哪些变化,并且只合并那些从一个分支合并到另一个分支时丢失的变化。
- 换行转换:表示一个系统是否能适配文本文件的换行符,从而匹配当前使用的操作系统的换行方式。控制变化的粒度,例如 Subversion,可以进行配置,依据文件类型来处理换行符的不同,而Perforce根据一个单一、每个客户端的配置转换所有的文本文件。
- 标签:表示是否可以给一个特定版本赋予一个带有含意的名字,无论这些名字被叫做标记还是标签。
- 国际化支持:表示该软件是否支持多语言环境和多操作系统。
- Unicode文件名支持:表示该软件是否支持使用不同[[字符编码]]的文件系统之间的互操作。
- 大库支持:系统能高效处理十亿字节左右或更大的库吗?
Remove ads
高级功能
表格说明
- 关键词扩展:支持关键词自动扩展,例如文件版本号。
- 交互式提交:交互式提交允许用户对变化精挑细选,并决定哪些变化可以提交(未被选择的变化只被保留为工作副本的变化),而不是只到文件级别的粒度。
- 外部引用:在源码树中嵌入外部库。
- 部分检出/复制:从库中只检出或复制特定子目录的能力。
- 权限位:在版本历史中跟踪文件权限位。
- 保留时间戳:对于文件系统属性中的最后修改时间,以提交时间覆盖检出时间。
- 用户自动合并工具:自动合并可以尝试通过用户选择的任何工具来进行(希望能以每个文件为基础来配置)。
- 支持的格式:支持读/写,或者只读(转换,有可能再重复)。
- 共享所得目标的构建缓存:通过这一能力,如果其他协作用户恰好共享了同样的依赖,可以引入其他用户构建的所得目标,而无需在本地重建它们。
Remove ads
基本命令
表格说明
- 绿格中不在[方括号]里的命令使用了交互式的命令行提示符。[方括号]中的文本用来解释哪里能找到等价功能。
- 库初始化:创建一个新的空库(比如,版本控制数据库)。
- 克隆:创建一个完全相同的库实例(在一个安全事务中)。
- 拉:将版本从远程库下载到本地库。
- 推:将版本从本地库上传到远程库。
- 本地分支:创建一个不存在于原始远程库中的本地分支。
- 检出:从(远程)库创建一个本地工作副本。
- 更新:用库中的最新版本更新工作副本中的文件。
- 锁定:锁定库中的文件,以免被其他用户更改。
- 添加:标记指定的文件,以便在下一次提交时添加到库中。
- 移除:标记指定的文件,以便在下一次提交时移除(注:保存在移除时及之前的相关版本历史)。
- 移动:标记指定的文件,以便在下一次提交时移动到新的位置。
- 拷贝:标记指定的文件,以便在下一次提交时拷贝。
- 合并:融合同一个工作副本路径的两个来源之间的差别。
- 提交:将变化记录到库中。
- 恢复:从库中恢复工作副本文件。
- 生成打包文件:创建一个包含压缩的对给定库的变化集的文件。
- 重定位:将本地提交重定位到已更新的上游地址。
Remove ads
高级命令
表格说明
- 绿格中不在[方括号]里的命令使用了交互式的命令行提示符。[方括号]中的文本用来解释哪里能找到等价功能。
- 命令别名:为指定的命令或组合创建定制的别名
- 锁定/解锁:排他性地锁定一个文件,以防被其他人编辑。
- 搁置/取消搁置:在工作目录中暂时搁置部分或全部的变化。
- 回滚:从历史中移除一个版本。
- 挑选:只把某些修订从一个分支移动到另一个分支(而不是合并分支)。
- 二分检索:在源码历史中,使用二分检索来查找一个变化的引入或修复。
- 出入:查询本地库和远程库之间的差别(该差别可能会以推/拉的方式发送/取回)。
- 过滤:在库中搜索,以找到那些匹配一个模式的行。
- 记录:在一次提交中只包含一个文件的某些变化,而不包含其它的变化。
Remove ads
用户界面
表格说明
- 软件:应用的名称。
- 网页版界面:表示应用软件是否包含一个网页版界面。网页版界面可以允许软件发送诊断数据到一个网站,甚至能允许对应用软件进行远程控制。
- 图形界面:GUI,图形用户界面。 如果一个软件产品提供了GUI,它的功能可以通过应用程序窗口来访问,而不是只能通过象DOS界面一样在命令提示符后面敲入命令来访问。
- 插件:功能通过集成开发环境来实现。 最低的功能应该是,列出文件的版本状态,及检入/检出文件。
Remove ads
历史及用户
表格说明
- 软件:应用的名称。
- 历史:简短地讲述软件的起源好发展。
- 知名用户:使用该软件作为主要版本控制系统的知名工程列表,不包括该软件自己。如果它有一个完整的列表,后边会列出该列表的链接。
Remove ads
参见
- 版本控制软件列表
- 自由软件托管服务比较
注释
- 在ClearCase中,可以设置触发器来打开锁定模式,这已经在很多地方使用。然而,ClearCase开发通常出现在个人分支,在这种情况下每个开发者拥有他们自己的分支,因此锁定还是合并的并发模式关系不大。一旦开发者准备好将他们的代码交付到项目中,代码就被合并到主分支。
- RTC不是分布式版本控制系统;但拥有某些分布式特征可以配置
- 原始的Unix源码存在各种变体,但只有一个在持续维护
- 当多个用户同时编辑一个文件的同一个版本时,只有其中一个可以将变化写回去。
- SCCS的某些变体是免费软件,而其它的则作为商业Unix分发的一部分保持封闭。
- 在Subversion中,一个文件属性允许锁定模式基于每个文件。
- Bazaar的critical模块是用Pyrex写的。
- Bazaar bundle是一个简要的差异,有足够的额外信息来保留历史。
- 二进制文件采用快照
- sqlite3.c的为4 MB
- Mercurial版本号是本地的;它们可以与库中的不同,这取决于按什么顺序执行合并。
- Monotone的版本代表变化集,它的清单代表快照,每个版本都链接到一些清单。但清单属于遗留结构,他们不再被保存到数据库中,也不能在需要时重建。现在真正的工作发生在rosters中,它是混合的快照/变化集结构。
- Veracity版本号是本地的;它们可以与库中的不同,这取决于按什么顺序执行合并。
- 邪恶分身是常事。邪恶分身在SCM,而不是好莱坞 互联网档案馆的存档,存档日期2013-10-16.(英文)
- 原子提交可以实现于个别检入ClearCase 7.1.1发布说明(英文)。
- darcs的每个补丁具有一个唯一标识符,不可能两次将同一个补丁合并到库中(除非使用“不安全”命令破坏性地修改历史)。
- 使用单项版本属性(“单项工作”演示,覆盖用户定义属性 (页面存档备份,存于互联网档案馆)(英文))。
- 它的消息和图形界面只有英语本地化,尽管软件被验证可以很好地运行在不同语言的操作系统上。
- Git不明确地跟踪重命名,因为从设计上它不跟踪个别文件。重命名和拆分源文件时,如果文件内容不发生显著变化,则会被检测到。
- 从git-1.7.9以后(见release notes Archive.today的存档,存档日期2013-04-15(英文))。更老的版本不对提交签名,仅标签(见git标签(1)手册页 (页面存档备份,存于互联网档案馆)(英文)中的-s选项)
- 自1.7.10版本起支持UTF-8文件名(MSysGit发布说明(英文))。
- 对于非常大的库,Git存在一些问题。见SoC 2012 Ideas (页面存档备份,存于互联网档案馆)(英文)中“更好的大文件支持”一节和“设计一个更快的索引格式”一节。
- 完全允许变化包提供全部工作流,21 CFR Part 11服从基于单项控制变化包的数字签名。
- 2009 SP5加入了一项功能来合并子开发路径。
- Mercurial正在进行翻译,目标语言至少包括荷兰语和汉语
- 可以通过用户级钩子实现
- Perforce将对符号链接本身进行版本控制,但如果您通过符号链接访问它们,并不会识别出它自己的被版本控制的视图(本地文件树)。
- 贯穿过程行为组件:操作顾问好操作参与者。http://jazz.net/library/article/292(英文) (页面存档备份,存于互联网档案馆)
- 虽然SCCS的源码是按支持国际化写的,但实际上只有英语的消息。
- 从2006版之后支持
- 当且仅当移动的目标文件与源文件在同一个Subversion库中,Subversion可以移动一个文件并保存它的历史。跨库的移动需要用第三方工具,比如svk。
- 从SVN 1.8开始,subversion在客户端支持改进的移动跟踪。在服务器端仍然不支持。
- 使用subversion服务器
- v6.6a到v7.1a在亚洲版,从v7.2开始在通用版
- 重命名时移除版本改变历史;旧名字不再被引用。
- 不能在动态视图中禁用。
- 使用CVSROOT/modules文件的别名。
- 当加入一个文件时,CVS会记录它的执行位,但并被允许在之后改变它。
- 这是一个GUI功能,它是通过TortoiseCVS和WinCVS来支持的,它们都包含/使用CVSNT。
- 和CVS一样,并增加了复制库(包括“影子”库)的能力。
- 使用模块/目录名或别名来创建,使用CVSROOT/modules或CVSROOT/modules2管理文件。
- 要求所使用的构建工具也支持。
- Darcs可以自动检测#!脚本,并在检出时使它们可执行。
- 使用子项目功能(文档包 | 用户指南 | 将一个项目或流关联到其它对象 (页面存档备份,存于互联网档案馆)(英文))。
- 可以嵌套检出,命令为“fossil open --nested”
- add -i和add -p,参见git-add(1)指南页面 (页面存档备份,存于互联网档案馆)(英文)
- 在服务器端可以作为项目选项配置,在客户端可以作为用户选项配置。
- commit --interactive,参见SVK::命令::提交 (页面存档备份,存于互联网档案馆)(英文)
- 通过第三方工具,如Tortoise SVN。
- SVN不能保留文件修改时间。如果客户端要求,它可以恢复检入时间作为最后修改时间。默认不支持。
- 文件的MIME类型必须被检测为一个“人类可读”的MIME类型,即使合并工具可以与非人类可读的文件一起工作。
- 重量级检出和轻量级检出, [2016-06-17], (原始内容存档于2016-06-30)
- 重定位插件
- darcs没有命名的分支,不管是否在本地,分支都是通过克隆库来单独处理的
- darcs send准备一组补丁,默认通过邮件发送,但也可以发送到一个文件
- pull是fetch加merge
- 拷贝在这之后被检测到,很象重命名
- Mercurial书签 (页面存档备份,存于互联网档案馆)(英文)类似于本地分支
- 通过任何方法,先把要设为不可变的文件放在一个不可变目录里,再vcheckin。
- 先把不可变文件从它的原始目录mv或link到它的目的不可变目录,再vcheckin。
- 通过任何方法,先把不可变文件从它的原始目录拷贝到它的目的不可变目录,再vcheckin。
- 您也可以启用它,在库服务器控制面板或配置文件中,作为一个主要的偏好
- 要求管理员权限。您可以使用“cvs update –e –j @commitid –j "@<commitid"”将一个变化“回滚”,但该变化和回滚会在历史中留下痕迹
- 使用TortoiseCVS或WinCVS来提交变化到目标服务器并选择保留哪个文件
- 二分检索可用于cvs,因此也可用于CVSNT
- darcs对补丁操作,而不是对修订,在把一个给定的补丁从一个库拉到另一个时,挑选组成部分比较简单,只要依赖被满足
- fossil stash支持借助注释来进行多个搁置
- git stash是一个多级搁置,它可以同时搁置多个变化集
- 仅当工作在本地库且没有子版本时。disapprove命令也许可以替代。
- svk状态列表用于在工作副本和库之间比较,而不是在两个库之间比较
- SVN二分检索工具svn-bisect. [2016-06-27]. (原始内容存档于2016-08-16) (英语).
- svn状态列表用于在工作副本和库之间比较,而不是在两个库之间比较
- 锁是报告形式的,在非连接状态下,不能强制执行
- 单库访问用hgweb,多库从一个HTTP地址访问用hgwebdir
Remove ads
参考文献
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads