2012年9月24日星期一

SVN 版本控制


1、什么是SVN(Subversion)

   SVN,即Subversion,是一个自由开源的版本控制系统,可以将数据恢复到早期版本,或者检查数据修改的历史,这些数据可以是源代码,也可以是其他类型的文件。


可以简单理解为一个版本控制器,主要实现多人协作开发文件共享和版本控制的一个过程。



特点:


  • 根据文件修改的次数自动增加版本号以便找回历史文件
  • 防止多人开发时同时修改一类文件导致文件覆盖或被删除
  • 及时更新和获取其他开发者的最新数据和文件
  • 有助于项目开发时的安全,责任细分化


2、结构

  • 服务器

       Tigris svn

  • 客户端

       Tortoise svn

3.服务器搭建

1.下载并安装tigris svn server 1.6.6

2.创建中心库 

    1.svnadmin create  D:\SvnRepository  
 #SVN 创建仓库

3.修改权限配置
 
    1.修改 SvnRepository\conf\svnserve.conf   #  SvnRepository(仓库的名称) 的配置文件
    2.修改 SvnRepository\conf\passwd   # SvnRepository(仓库的名称) 客户端用户的访问配置文件 

服务器运行方式

  • svnserve 
  • apache http

4.运行

svnadmin help  #SVN 管理帮助
svnserve -d -r D:/SvnRepository    # 启动SVN在后台以root的权限运行     不能关掉DOS命令控制台



5.备份

在 Subversion 中,有三种备份方式:完全备份、增量备份和版本库同步

(1)完全备份
     
     命令格式:svnadmin hotcopy 源备份目录 目标备份目录

    svnadmin hotcopy D:\svnroot\bbs D:\svnrootbak\bbs

(2)增量备份

   当版本库数量非常多或非常大,或者不经常变动时,频繁地进行完全备份即浪费资源,也会影响到其他工作的效率,是完全没必要的。我们既想备份最新的版本库,又不想备份整个版本库,该怎么办呢?Subversion 为我们提供了一个只备份增量数据的命令,它通常与完全备份结合来使用。增量备份可以记录每次 Subversion 的提交变化,如果出现问题,也可以通过备份文件恢复到最新的可用状态。下面是使用 svnadmin dump 命令进行增量备份的示例:
    svnadmin dump D:\svnroot\shop --revision 5 --incremental > D:\svnrootbak\dump\shop.dump

   命令格式:svnadmin dump 源备份目录 --revision 版本号 --incremental > 目标备份目录

    注意:如果不加参数 --incremental,后面执行 load 时会提示 “版本库已存在”。参数 --revision 用于指定要备份的版本。

    Subversion 提供了一个钩子(hook)特性,使用它可以记录每次提交的结果。在版本库的目录结构中,hooks 目录里存放的就是钩子脚本,在这里我们只使用 post-commit 钩子,它会在每次提交之后执行。为了实现增量备份功能,我们在 hooks 目录下创建一个名为 post-commit.bat 文件,内容如下:

   echo off
   set SVN_HOME="D:\subversion"
   set SVN_ROOT=D:\svnroot
   set DELTA_BACKUP_SVN_ROOT=D:\svnrootbak\delta
   set LOG_FILE=%1\backup.log
   echo backup revision %2 >> %LOG_FILE%
   for /r %SVN_ROOT% %%I in (.) do if D:\svnroot\%%~nI == %1 %SVN_ROOT%\%%~nI\hooks\deltaBackup.bat %%~nI %2
   goto end
   :end

   通过这个脚本,可以实现 D:\svnroot 下的版本库在提交时自动将增量数据备份到 D:\svnrootbak\delta(确定这个目录存在)目录下。脚本 deltaBackup.bat 是对svnadmin dump 命令的封装,可以放在任何地方,其内容如下:

   @echo 正在备份版本库%2......
   %SVN_HOME%\bin\svnadmin dump %SVN_ROOT%\%1 --incremental --revision %2 >> %DELTA_BACKUP_SVN_ROOT%\%1.dump
   @echo 版本库%2成功备份到了%3!

   把以上两个脚本复制到其它版本库的 hooks 目录下,不需要做任何修改就可以实现增量数据的自动备份。

    注意:完全备份和增量备份结合使用时,在完全备份之后一定要处理增量备份文件,使其只保存完全备份后的增量信息

   如果版本库出现问题,我们可以通过备份文件恢复操作。使用 svnadmin load 命令来恢复以前的版本,命令如下:

   svnadmin load D:\svnrootbak\shop < D:\svnrootbak\dump\shop.dump

    命令格式:svnadmin load 最新完全备份文件目录 < 增量备份文件目录

(3)版本库同步

   svnsync.exe 是在 Subversion 1.4 中增加的版本库同步工具,通过它可以实现一个版本库与另一个版本库的同步(同步是单向的),我们可以通过该功能达到备份版本库的目的。

    首先在 svn 根目录下面创建一个 newshop 的版本库,用于同步已存在的 shop 版本库,然后使用 svnsync init 命令进行初始化,建立同步版本库之间的关系。例如:

    svnsync init svn://localhost/newshop svn://localhost/shop [--username username --password password]

    命令格式:svnsync init 目标版本库URL 源版本库URL [--username 用户名 --password 密码]

    其中的 username 是具有访问目标版本库权限的用户。

    注意:目标版本库必须是一个空的版本库,还需要在目标版本库 newshop 的 hooks 目录下新建一个名为 pre-revprop-change.bat 的文件,内容为空即可,否则会提示错误信息:
svnsync:此版本库不允许修改版本属性;请管理员创建 pre-revprop-change 钩子”

   接着,使用 synsync sync 命令来实现目标版本库与源版本库的真正同步,例如:

     svnsync sync svn://localhost/newshop 

    命令格式:svnsync sync 目标版本库URL

   执行完上面的命令后,在 newshop 对应的目录下右键单击 SVN 更新(update),会发现同步前在 shop 下提交的内容都会被更新。如果 shop 下有新提交内容,在 newshop 下是无法捕捉到的,需要重新执行 svnsync sync 命令,再次进行更新。

    注意:目标版本库 newshop 只能是只读的,如果有文件发生变更,则无法继续同步了。还可以通过 svnsync 的子命令同步版本属性,例如:
 svnsync copy-revprops svn://localhost/newshop 
 命令格式:svnsync copy-revprops 目标版本库URL


   我们也可以使用 Subversion 的钩子机制来实现每次提交的自动同步,从而解决每次手动同步带来的麻烦。在源版本库 (shop)的 hooks 目录下创建一个名为 post-commit.bat 的文件,内容如下所示:

    echo off
    set SVN_HOME="D:\subversion"
    %SVN_HOME%\bin\svnsync sync --non-interactive svn://localhost/newshop

    如果源版本库执行了相关修改,在更新目标版本库时也会有同样的修改。但是,如果目标版本库设置了访问权限,每次源版本库修改时就会提示“钩子post-commit失败(退出代码1)输出”错误,解决办法是在 synsync 命令后面最加 --username 和 --password属性,例如:
      %SVN_HOME%\bin\svnsync sync --non-interactive svn://localhost/newshop --username ccc -password 333333


没有评论:

发表评论