基于SVK的分布式集中版本库管理

[b]1、版本库管理方案概述[/b]
多人团队式项目开发中,版本管理的重要性和必要性已不必多言,现在大家都已适应了版本控制的开发模式,若哪个项目没有版本管理,相信很多开发人员都会心生惶恐,不太适应了。
这里要讲述的版本管理方案对项目中的开发人员没有任何影响,他们还是会使用先前的版本控制开发模式进行项目的开发。这里要讲述的是项目的管理人员或者准确的说是公司的项目管理人员如何进行项目的版本“库”管理。当然开发人员了解并熟悉版本库的管理方案,对开发工作的版本控制也是很有好处的。
实际的项目开发中,大体有如下三种版本库管理方案:分散式、集中式、分布集中式。

[b]A、分散式版本库管理方案[/b]
分散式版本库管理是指项目的版本库由项目自行管理,与其它项目的版本库没有任何关系,各项目的版本库形成一个个离散的孤岛。而通常项目是本地化开发,因此项目的版本库都存放在各个项目地。
这种版本库管理方案的好处是各项目地开发人员对版本库的管理有任意的控制权,这也意味着有极大的灵活性。但毫无疑问,这种版本库管理方案给公司的集中管理、规范化管理带来了很大的麻烦。事实上也加重了各项目组版本管理的负担。

[b]B、集中式版本库管理方案[/b]
集中式版本库管理方案的指版本库集中统一管理,各项目不需考虑版本库的存储、权限控制、库结构规划等问题。简言之,各项目组基本不需考虑版本库的管理问题,版本库的管理全部交由公司统一专人管理与控制。
这种版本管理方案对公司层面要求较高,要求公司有规范的版本制度、有专业的版本管理人员,甚至还要求公司有专业的服务器设备及管理手段。
集中式版本库管理方案对网络有严重依赖。当项目地的网络出现问题时,项目的正常开发工作将受到极大影响。另外,如果网络速度较慢,也会影响项目的日常开发工作。

[b]C、分布式集中版本库管理方案[/b]
介绍了上面的两种方案,相信聪明的读者已经明白了第三种方案所要解决的问题。是的,分布式集中版本库管理方案正是融合了”分散式管理库”和“集中式版本库”的长处,同时又避免了他们的短处。
具体来说,这种方案要求在公司建立集中的版本库,同时在项目地也建立项目版本库,通过版本库的自动同步工具保持项目地的版本库与集中版本库的自动同步。项目地开发人员日常开发访问的都是本地版本库,这样就避免了对网络的依赖,同时解决了网速慢的问题。
通常集中式版本库有严格的权限控制,同时对服务器也良好的备份管理。而各项目的版本库通常没有太多的访问权限控制;因为能自动同步,项目版本库也不要求有完善的备份机制。
当然相对于第一种方案来讲,这种方案增加了项目地版本库管理的难度,因为除了要管理本地库外,还需要管理和维护本地库与集中版本库的同步。幸运的是,现在有了SVK工具,极大降低了版本库间的同步工作难度。也正是因为有了这样的工具,“分布式集中版本库管理方案”才真正变得切实可行。

[b]2、分布式集中库管理本管理方案实践[/b]
这里介绍的实践方案是采用基于SVK+Subversion的方案,即项目的版本库使用和公司的集中版本库都使用Subversion来管理,两个版本库之间的同步使用SVK来实现。若项目版本库和集中版本库使用CVS,按SVK的文档介绍来看,应该也是可行的,但本人未实际使用,不敢保证其可行性。
首先介绍一下前面提到的SVK,也是本方案的核心工具,SVK是基于Subversion实现的分布式版本控制系统,通常使用SVK实现开发人员对集中式版本库的分布式和离线式访问。其典型的用法请参考SVK的官方文档,这里不详述。要特别提出的是,虽然SVK是基于Subversion实现的,但它并不要求集中版本库也是Subversion,实际上SVK是支持多种非Subversion的版本库的。
下面介绍这种方案的具体配置步骤:

[b]A、建立集中版本库[/b]
集中版本库的建立与一般的版本库建立步骤是一样的,这里特别提醒应该注意如下几点:

* 严格的访问权限控制:可以使用SVN的访问控制机制实现;
* 用户身份验证:可以使用用户密码加数字证书的双因素认证机制,保障版本库不被非法访问,证书管理可以使用Windows Server的内建CA来实现。
* 应该有UPS保障版本服务器的不间断访问;
* 应该有完善的版本库备份机制,集中版本库应用越广,备份越重要;
* 应该提前规划好版本库的目录结构,否则后续要更改库结构会相当麻烦;
* 使用Subversion + Apache时可通过PHP实现用户密码的修改;
* 使用Subversion时可使用其hook机制实现提交时强制写日志的功能;

[b]B、配置SVK[/b]
SVK在本方案中的作用有两点:一是用于自动进行项目地版本库与集中版本库间的同步;二是充当项目地版本库供项目日常开发使用。具体配置如下:

* 下载并安装SVK:在ubuntu环境下直接使用新立得管理工具进行SVK的安装;其它linux环境下的安装可以参考SVK官方网站的说明;Windows环境的安装需要下载SVK的相应版本并安装,但据网上的说法,SVK的Windows版本安装配置比较复杂,而且容易出问题,因此建议在Linux环境下安装SVK;
* 建立SVK版本库(SVK的术语是depot):执行如下命令创建SVK版本库,库路径默认在当前用户目录下的.svk/local目录中;

svk depot

* 建立本地库与集中库的映射关系:执行如下命令后将在本地库路径//remote/cscb2与集中版本库的cscb的主干间建立映射关系;

svk mirror https://www.subverson.com/cscb/trunk2/trunk //remote/cscb2

* 建立本地版本库:上面的命令创建的//remote/cscb2库仅用于保持本地库与集中库间的映射关系,不应该被被项目日常开发所直接访问。使用如下命令创建的本地库才是项目日常开发所访问的版本库:

svk cp //remote/cscb2 //local/cscb2

* 禁止映射库的对外访问:映射库//remote/cscb2必须禁止外部访问,否则可能破坏映射关系,导致无法进行本地库与集中库间的同步。若使用http协议访问本地库则参考svn的apache配置禁用指定路径的对外访问权限,若使用svn协议访问本地库,则可修改~/.svk/local/conf/authz文件,配置路径访问权限,参考内容如下:

[/local]
* = rw
[/remote]
* =

* 首次同步:通常集中版本库是先建立的,因此需要将集中版本库中的内容同步到本地版本库中。如果集中版本库中的版本数不多,可以采用第一条命令将集中版本库中的所有版本全部同步到本地;如果集中版本库中的版本过多,又不想在本地版本中保存过多的历史版本,则可以采用第二条命令仅同步集中版本库中指定版本开始的所有版本;

svk sync //remote/cscb2 -- 同步所有历史版本
svk sync -s 3145 //remote/cscb2 -- 同步集中版本库中3145以来的所有版本

* 同步本地版本库:上面的命令只是将集中库中的版本同步到了本地的映射库//remote/cscb2中,此时//local/cscb2中还没有任何版本,必须再使用如下命令将映射库内容同步到本地库中:

svk pull //local/cscb2

* 至此项目组即可通过如下路径访问本地库:

svn://162.16.1.22/local/cscb2

* 上述配置完成后,项目组即可在本地库中进行日常开发,但如何进行本地库的同步呢?也就是如何将集中库中的版本及时下载到本地,而本地中的修改版本又如何上传到集中库中呢?这里就要感谢SVK了,他提供了如下命令完成前述操作:

svk sync //remote/cscb2 -- 同步集中库与本地映射库
svk pull //local/cscb2 -- 将映射库中版本下载到本地库中
svk push //local/cscb2 -- 将本地库中版本上传到映射库并同步到集中库中

* 为了让同步自动进行,我们可将上述命令编写到一个脚本文件中,并设定定时任务以自动执行,需要注意的是,在linux环境下自动执行上述命令时,同步到集中库的commit日志log可能出现乱码,这时需要在crontab中指定LANG=zh_CN.UTF-8以设定字符集

[b]3、结束语[/b]
分布式集中版本管理方案为我们提供了介于离散版本库管理和集中版本库管理之间的折衷方案,在现阶段是具体较高可行性与可操作性的一种方案,值得我们偿试使用。但是由SVK还是一个非常不成熟的产品,实际使用中肯定还是会遇到各种各样的问题,这就需要各项目自已解决与取舍了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
H4sIAAAAAAAAAO1YS2/bRhD+Kwblo0XzsXxIN8F2GgN2asR2e6gLYkUuzY1ILrFcSlACA+qhaHtpDi0KFOm1l556aIuiyJ/RwS76LzrLhy3ZUmwjbZAY0kXk7Mzuzsz3fUvysxeKJzj2Bx4NlK6pIYR0yzA3FEETonR120WuYbqWriEDjOMMjEoZoGwoAc0FTX1RxioGwmZomMh3+m4Qaj444JSl44QV+VKPmPaV7gtlHf69hIiIST+fBQTG1stBpZcGnEF8ZfCGhOeUpTBgqYZqSTPOshkzUpHqNt4BEZjG5ZyJmpM0ZzwPsMAqTnE8FtTP4aqcX82Dgdrr5zI5cVh5boNn72C31Soz3hmSVOymgnCIbbUW+6rP8BC3WjqyLeVsQyEyBpZPMuFV1xtKxllGuKAkL1PPfU5I6kWEnkbg6uoa7J3ld848xbJTyv7BETqWtoAMqU+WVnw9gerKiuwX+4W873OogFztyfbTj3e3lXL1mcVsVVP1N5RZIuU5S4nHwjAnkEEbuTKFBKdFCPUpOOHg/2TnaKd3uCMj6oxHNBARYAwhbVGz5XJlEkmiyu5BCYc4l/WLsQgZT7wajlt7B2u9LIMRmnsxO6WwPcELAuiSN14Wyd2lRQK+HauDNMvQHMftVK0IPJrmFYR1XXeR3rFsG+mwgRENaTPTekrEiPFBs+anu492lXqBrZhWTe6BxceCnDI+htvHLJEwjnG/rPehwIA3yQpfVCU8wv21PuYnm9PJZDr5Yzr5cjr5cTr5azr5czp5NZ18D9eyEpCWH+E0JbHn4zjuS7rWwApxnMvtNeNN89OQwQJ6A50b1IIpQ8oh7wCP61kArV4YF3nkzXPftizTPduYEwrXtl3HdszOTaHQTe2dCQUuBDuq1/jP1YKOIhwTP2ZFILGHCrWgagQ9VfcxTXvQxCEV41b5m6X6OmARIFFuakX1B0P1dRKTBDpcbZQDFRkcBaWgXw41pq5yC6ObgHqJ5giCMp0SoT4lkDYdkj08ZoWYKWPd/7ujs2qaiOdQs5xCb6kKhmbbhmlDvW/KgmmhBywLMJCwVN0q/94sDZ9QMjos27nShwelD5yEhFcJ3o+gBb8/tu4hCkvj/2dhoAGAnl5iu74dg0iyAa1BqbsucizT7ziahdtax7YC2w1DbOu4bSHHtfp6v420TsfQ2le+vm4akla36seMOoDDs3zp49A8p3TVMFRzGc7PbtB2GewX0nkh4ocgChnj4spXvoNdmWvvatrr2SzaOPCCQLtAacOQ+l7OCg5CUCP271e/XXz788XvX/zz1csZ55xg7kfegIwB3rI6Fz/9cv7yh/Ovfz2fvPbqoG++O389mQmaQf01ElxBOxIi655snmwCJv04k9CsaJx0Xc3WTjZbJ5tx4Q+2OR59REOxB32to70My8SVk81riF1Da8dLkDlrrbBZE7fZnBexXNQ7vK6u74OMLpfLpUJ4F4V6J2J5dpdT+9pzwOXxmOFTIjGv3Hh+MFEHoD/zrNG2QC1MzZWvIF407nMaeJHVJLBSpiq1igRDmtOGCoqhGWZbs9qGuaajrul0TVO1DEPOWXlfo3Bl7HM2yoE5MU5PC+gSDD6P2n560wPeRHkpgsrx0aO2e+VwNy2qfO8hRfcBHFQnpDGB6YXHUp8swJll2HM4s1wdUONYK5Stzr8P9vxrzKsD8MM9AC1zXph0G5TGMZFjr6RpJU23S9McmGehvERC3k66FijVSmjeH6GRH6EeU3GAi8EiqUHOnNSAypjys55xL6XpnH3+L4jsCGheHAAA对这个字符串进行解码时,使用了URLDecoder.decode,然后使用了Base64.getDecoder().decode()方法,出现Caused by: java.lang.IllegalArgumentException: Illegal base64 character 20
06-09
这个问题的原因是因为H4sIAAAAAAAAAO1YS2/bRhD+Kwblo0XzsXxIN8F2GgN2asR2e6gLYkUuzY1ILrFcSlACA+qhaHtpDi0KFOm1l556aIuiyJ/RwS76LzrLhy3ZUmwjbZAY0kXk7Mzuzsz3fUvysxeKJzj2Bx4NlK6pIYR0yzA3FEETonR120WuYbqWriEDjOMMjEoZoGwoAc0FTX1RxioGwmZomMh3+m4Qaj444JSl44QV+VKPmPaV7gtlHf69hIiIST+fBQTG1stBpZcGnEF8ZfCGhOeUpTBgqYZqSTPOshkzUpHqNt4BEZjG5ZyJmpM0ZzwPsMAqTnE8FtTP4aqcX82Dgdrr5zI5cVh5boNn72C31Soz3hmSVOymgnCIbbUW+6rP8BC3WjqyLeVsQyEyBpZPMuFV1xtKxllGuKAkL1PPfU5I6kWEnkbg6uoa7J3ld848xbJTyv7BETqWtoAMqU+WVnw9gerKiuwX+4W873OogFztyfbTj3e3lXL1mcVsVVP1N5RZIuU5S4nHwjAnkEEbuTKFBKdFCPUpOOHg/2TnaKd3uCMj6oxHNBARYAwhbVGz5XJlEkmiyu5BCYc4l/WLsQgZT7wajlt7B2u9LIMRmnsxO6WwPcELAuiSN14Wyd2lRQK+HauDNMvQHMftVK0IPJrmFYR1XXeR3rFsG+mwgRENaTPTekrEiPFBs+anu492lXqBrZhWTe6BxceCnDI+htvHLJEwjnG/rPehwIA3yQpfVCU8wv21PuYnm9PJZDr5Yzr5cjr5cTr5azr5czp5NZ18D9eyEpCWH+E0JbHn4zjuS7rWwApxnMvtNeNN89OQwQJ6A50b1IIpQ8oh7wCP61kArV4YF3nkzXPftizTPduYEwrXtl3HdszOTaHQTe2dCQUuBDuq1/jP1YKOIhwTP2ZFILGHCrWgagQ9VfcxTXvQxCEV41b5m6X6OmARIFFuakX1B0P1dRKTBDpcbZQDFRkcBaWgXw41pq5yC6ObgHqJ5giCMp0SoT4lkDYdkj08ZoWYKWPd/7ujs2qaiOdQs5xCb6kKhmbbhmlDvW/KgmmhBywLMJCwVN0q/94sDZ9QMjos27nShwelD5yEhFcJ3o+gBb8/tu4hCkvj/2dhoAGAnl5iu74dg0iyAa1BqbsucizT7ziahdtax7YC2w1DbOu4bSHHtfp6v420TsfQ2le+vm4akla36seMOoDDs3zp49A8p3TVMFRzGc7PbtB2GewX0nkh4ocgChnj4spXvoNdmWvvatrr2SzaOPCCQLtAacOQ+l7OCg5CUCP271e/XXz788XvX/zz1csZ55xg7kfegIwB3rI6Fz/9cv7yh/Ovfz2fvPbqoG++O389mQmaQf01ElxBOxIi655snmwCJv04k9CsaJx0Xc3WTjZbJ5tx4Q+2OR59REOxB32to70My8SVk81riF1Da8dLkDlrrbBZE7fZnBexXNQ7vK6u74OMLpfLpUJ4F4V6J2J5dpdT+9pzwOXxmOFTIjGv3Hh+MFEHoD/zrNG2QC1MzZWvIF407nMaeJHVJLBSpiq1igRDmtOGCoqhGWZbs9qGuaajrul0TVO1DEPOWXlfo3Bl7HM2yoE5MU5PC+gSDD6P2n560wPeRHkpgsrx0aO2e+VwNy2qfO8hRfcBHFQnpDGB6YXHUp8swJll2HM4s1wdUONYK5Stzr8P9vxrzKsD8MM9AC1zXph0G5TGMZFjr6RpJU23S9McmGehvERC3k66FijVSmjeH6GRH6EeU3GAi8EiqUHOnNSAypjys55xL6XpnH3+L4jsCGheHAAA是经过URL编码的,其中包含了%20这个字符,这个字符在URL编码中代表的是空格。 在对这个字符串进行解码时,如果没有正确处理URL编码,就会导致解码失败并抛出IllegalArgumentException异常。 要解决这个问题,可以先对URL编码进行解码,然后再进行Base64解码。可以使用java.net.URLDecoder类的decode()方法进行URL解码,例如: ``` String input = "H4sIAAAAAAAAAO1YS2/bRhD+Kwblo0XzsXxIN8F2GgN2asR2e6gLYkUuzY1ILrFcSlACA+qhaHtpDi0KFOm1l556aIuiyJ/RwS76LzrLhy3ZUmwjbZAY0kXk7Mzuzsz3fUvysxeKJzj2Bx4NlK6pIYR0yzA3FEETonR120WuYbqWriEDjOMMjEoZoGwoAc0FTX1RxioGwmZomMh3+m4Qaj444JSl44QV+VKPmPaV7gtlHf69hIiIST+fBQTG1stBpZcGnEF8ZfCGhOeUpTBgqYZqSTPOshkzUpHqNt4BEZjG5ZyJmpM0ZzwPsMAqTnE8FtTP4aqcX82Dgdrr5zI5cVh5boNn72C31Soz3hmSVOymgnCIbbUW+6rP8BC3WjqyLeVsQyEyBpZPMuFV1xtKxllGuKAkL1PPfU5I6kWEnkbg6uoa7J3ld848xbJTyv7BETqWtoAMqU+WVnw9gerKiuwX+4W873OogFztyfbTj3e3lXL1mcVsVVP1N5RZIuU5S4nHwjAnkEEbuTKFBKdFCPUpOOHg/2TnaKd3uCMj6oxHNBARYAwhbVGz5XJlEkmiyu5BCYc4l/WLsQgZT7wajlt7B2u9LIMRmnsxO6WwPcELAuiSN14Wyd2lRQK+HauDNMvQHMftVK0IPJrmFYR1XXeR3rFsG+mwgRENaTPTekrEiPFBs+anu492lXqBrZhWTe6BxceCnDI+htvHLJEwjnG/rPehwIA3yQpfVCU8wv21PuYnm9PJZDr5Yzr5cjr5cTr5azr5czp5NZ18D9eyEpCWH+E0JbHn4zjuS7rWwApxnMvtNeNN89OQwQJ6A50b1IIpQ8oh7wCP61kArV4YF3nkzXPftizTPduYEwrXtl3HdszOTaHQTe2dCQUuBDuq1/jP1YKOIhwTP2ZFILGHCrWgagQ9VfcxTXvQxCEV41b5m6X6OmARIFFuakX1B0P1dRKTBDpcbZQDFRkcBaWgXw41pq5yC6ObgHqJ5giCMp0SoT4lkDYdkj08ZoWYKWPd/7ujs2qaiOdQs5xCb6kKhmbbhmlDvW/KgmmhBywLMJCwVN0

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值