06年进公司的时候,我们没有使用版本控制系统,所有代码都在部门经理的电脑上放着,谁要改什么代码就过去要一份最新的,改好之后再放回去,感觉好原始。据说之前是用过一段时间微软的vss(visual.source.forge),曾经也搭建过vss服务器,但是中间不知道什么原因中断了,也就没有继续坚持了,可能是当时人还少,整个软件研发也就是10个人左右。所以没有使用版本控制也没有出什么大问题。

进公司之前,由于在matin fowler的《重构》中有提到版本控制系统,我就在自己电脑上搭建一个cvs服务器玩,完成一个小功能就提交一次,写好log,写错了再撤销回来,切实感觉到了有版本控制系统的好处,他就像是一个时光机器,可以让我回到之前的任何一个时间点。我再也不用不断的使用winrar压缩来做备份了。

所以在进公司半年,在摸清了部门的运转机制之后,就向领导提出提出希望可以引入版本控制系统。然后领导就同意了(没想到这么顺利),然后就是版本控制系统的选择问题,比如是继续使用当年的vss,还是寻找开源替代品,比如cvs或者其他的什么,现在已经不记得当年是如何选择的,不过我自己在使用cvs的时候确实是有一些不愉快的经历,库文件损坏。最终选择了svn,那会svn已经出来五年多了(2007),已经是比较稳定了,而且除了命令行,已经有各种插件/图形化工具可以使用。比如我们就使用visutal svn来搭建服务器,而使用tortoiseSVN来做客户端,然后再使用Visual SVN提供的vs的插件来解决和vs集成的问题,基本上整个流程就跑通了。然后就是组织培训,在组织内宣贯,这样前后大概过了一个季度,才陆续的将以前的代码迁移到svn服务器上。

在搭建服务器的过程中,一个比较明知的决定就是使用与服务器来同一用户管理,这样就可以同一svn和ftp两套系统的用户管理。visualSVN本身不支持域用户,所以需要另外搞个插件来做域用户与svn用户的映射,具体是什么有点不记得了。

这样服务器跑起来之后,稳定使用了三年多,随着公司的扩张,部门的人越来越多,新项目也越来越多,这时候问题就出来了,由于代码权限的问题,之前一直都是由部门经历兼职做配置管理员,由他负责svn的项目库创建,权限的分配等,现在有八九十号人的权限需要管理,差不多每天都有人需要申请svn的权限:创建项目库/分配老代码的读权限/写权限,等等。这样会占用他较多的时间,让一个部门经理来配置管理员的工作确实是有点浪费。

这个问题的核心在于svn不支持分级授权:比如如果给一个目录或者库指定了一个管理员,然后就可以由这个管理员来管理该库下面的所有目录的权限。

如果能够支持分级授权,那么部门经理的管理工作就会少很多,他只要负责创建库,然后分配管理员,其他的事情都可以由管理员来完成,这样就会比较理想。所以我们就开始重新寻找新的替代品。最终选择的是微软的TFS。之所以选择TFS一方面也是因为我们原来的那个bug管理系统不好用,也迫切希望能有一个新的替代品,而TFS是一个一体化的解决方案,可以在上面做版本控制,登记缺陷,做项目计划,发布会议通知,组织评审等,而且每个项目还可以有的门户。确实功能比较强大,然后,刚好他的版本控制系统有分级授权的功能。这就圆满了。

当然,搭建tfs服务器是一个比较麻烦的事情,这点去网上找相关文章吧,这里就不细说了,总之用微软一般就用全套,从他的服务器到数据库服务器到sharepoint到tfs服务器。

切换过去这两三年使用起来也还算平稳,没出什么大乱子。

另外提一下,不管是svn还是tfs,这种集中式的版本控制系统有一个问题,服务器如果挂了,大家就没法工作了,特别是我们是公司是两个中心模式,两个研发中心通过vpn相连,如果偶尔网络不好,那么另外一个研发中心的同事基本上就很多事都干不成了。这种问题对于中央式仓库没有什么很好的方法。而且目前网络中断的情况没有经常发生,所以也就没有成为内部主要矛盾。

集中式版本控制系统:从svn到tfs的更多相关文章

  1. linux进阶之SVN集中式版本控制系统篇

    代码上线--版本控制系统 SVN             集中式版本控制系统 git                 分布式版本控制系统 SVN是subversion的缩写,即版本控制系统,是一个开放 ...

  2. Git学习系列之集中式版本控制系统vs分布式版本控制系统

    不多说,直接上干货! Linus一直痛恨的CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢? 先说集中式版本控制系统,版本库是集中存放在中央 ...

  3. git-版本管理工具的介绍+发展史+分布式版本控制系统和集中式版本控制系统的区别

    一.版本管理工具的介绍: 1.备份文件: 2.记录历史: 3.多端共享: 4.团队协作: 二.版本管理工具的发展史: 1.cvs: 集中式   1985: 2.svn:  集中式    2000: 3 ...

  4. 关于分布式版本控制系统Git与集中式版本控制系统SVN的区别

    我觉得最最主要的区别就是:分布式Git主要是在本地有各个历史版本,在不联网的时候,也可以更新到最新版本和查看过去的版本,而集中式SVN是所有人都将版本上传到中央服务器,当出现断网情况的时候,用户只有一 ...

  5. 集中式(CVS、SVN)VS分布式(Git)

    集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器.中央服务器就好比是一个图 ...

  6. 版本控制系统之SVN和GIT的区别

    版本控制器的作用: 1. 可以协同代码管理,让多人开发代码得以实现. 2. 回归到以前的任何一个时间点的代码处(好比:开始写了很多代码,后面有修改了一些,突然IDE崩溃,但是发现还是以前的代码更好,这 ...

  7. SVN集中式版本控制器的安装、使用与常见问题汇总

    SVN是Subversion的简称,是一个开放源代码的版本控制系统,它采用了分支管理系统,集中式版本控制器 官方网站:https://www.visualsvn.com/ 下载右边的服务器端,左边的客 ...

  8. SVN 集中式版本控制软件

    简介: 目前流行的版本控制软件中,SVN ( 集中式版本控制 ) 算是使用范围更广.且使用时间更早的一款了,现在 git ( 分布式版本控制 ) 更火爆一点. 一.安装svn [root@localh ...

  9. 细说SVN集中式版本控制器

    svn全称Subversion,实现多人开发同一个项目时,对源代码进行管理的工具.在公司里边,一个项目是由多人同时在开发,大家在本地自己电脑开发php代码,完毕后就commit上传给服务器运行.  如 ...

随机推荐

  1. 推送(PUSH)

    一.本地推送 1.建立本地推送 UILocalNotification *notification = [[UILocalNotification alloc] init]; //推送的内容 noti ...

  2. 匿名内部类--毕向东java基础教程学习笔记

    1.匿名内部类其实就是内部类的简写形式. 2.定义匿名内部类的前提: 该内部类必须继承一个类,或者实现一个接口. 3.匿名内部类的格式:new 父类名或接口名(){定义子类内容:} 4.其实匿名内部类 ...

  3. 【Android】 Android实现录音、播音、录制视频功能

    智能手机操作系统IOS与Android平分天下(PS:WP与其他的直接无视了),而Android的免费招来了一大堆厂商分分向Android示好,故Android可能会有“较好”的前景. Android ...

  4. 关于Redis中交互的过程

    一.Redis启动 加载配置(命令行或者配置文件) 启动TCP监听,客户端的列表保存在redisserver的clients中 启动AE Event Loop事件,异步处理客户请求 事件处理器的主循环 ...

  5. Linux下shell颜色配置

    颜色配置涉及以下几个地方(本人常用的):命令提示符,文件及目录名显示,echo -e命令 1.颜色值分为前景色和背景色,颜色码值对应关系如下: Front Back Color 黑 红 绿 黄(棕) ...

  6. jQuery Form 表单提交插件----Form 简介,官方文档,官方下载地址

     一.jQuery Form简介 jQuery Form插件是一个优秀的Ajax表单插件,可以非常容易地.无侵入地升级HTML表单以支持Ajax.jQuery Form有两个核心方法 -- ajaxF ...

  7. tfs witadmin

    有时候对TFS的操作需要使用命令行,因为无图形界面进行操作. 我们可以进入Visual Studio Tools使用Developer Command Prompt进行操作. 使用命令 witadmi ...

  8. dotnet use regex two samples

    One sample is used to replace double quote from words which encapsulated by csvwriter , you know csv ...

  9. Java向上转型与向下转型

    一.向上转型 例如:Parent p=new Son(); 这样引用p只能调用子类中重载父类的方法:但属性是父类的:如果想调用子类属性的话,可以用getter()方法. 二.向下转型 子类对象的父类引 ...

  10. LeetCode 2 Add Two Sum 解题报告

    LeetCode 2 Add Two Sum 解题报告 LeetCode第二题 Add Two Sum 首先我们看题目要求: You are given two linked lists repres ...