您的位置:首页 > 其它

SVN版本控制的环境搭建

2013-11-03 17:01 387 查看

1、前言

2、版本控制概念

2.1、什么是版本控制

简单点来说,版本控制就是数据仓库,它可以记录你对文件的每次更改。这样,就算你在昏天黑地的改了几个月后老板说不要了,还是按照过去那样,你也不会抓狂,简单的恢复版本操作就搞定一切。
 

2.2、什么是 Subversion

Subversion是一个自由/开源版本控制系统,它管理文件和目录可以超越时间。一组文件存放在中心版本库,这个版本库很像一个普通的文件服务器,只是它可以记录每一次文件和目录的修改,这便使你可以取得数据以前的版本,从而可以检查所作的更改。从这个方面看,许多人把版本控制系统当作一种“时间机器”。
Subversion可以通过网络访问它的版本库,从而使用户可以在不同的电脑上使用。一定程度上可以说,允许用户在各自的地方修改同一份数据是促进协作。进展可能非常的迅速,并没有一个所有的改变都会取得效果的通道,由于所有的工作都有历史版本,你不必担心由于失去某个通道而影响质量,如果存在不正确的改变,只要取消改变。
一些版本控制系统也是软件配置管理(SCM)系统,这种系统经过特定的精巧设计来管理源代码,有许多关于软件开发的特性—本身理解编程语言、或者提供构建程序的工具。然而,Subversion不是这样一个系统,它是一个通用系统,可以管理任何类型的文件集,对你这可能是源代码,对别人,可能是一个货物报价单或者是书稿等。
 
2.3、版本库(repository)

Subversion 的核心就是 repository ,中文翻译成“版本库”。就是位于服务器端,统一管理和储存数据的地方。

3、搭建SVN平台

1、软件

1)服务端:Subversion

subversion.apache.org - Getting Subversion - Binary Packages - Windows - Win32Svn - Files - 1.6.16 - svn-win32-1.6.16.zip

http://subversion.apache.org/

http://subversion.apache.org/download/#recommended-release

安装包版下载:http://sourceforge.net/projects/win32svn/files/?source=navbar

解压svn-win32-1.6.16.zip到C:\My Program Files

2)客户端:TortoiseSVN

tortoisesvn.tigris.org - tortoisesvn.net/downloads - TortoiseSVN 32-bit - downloads.sourceforge.net/tortoisesvn/TortoiseSVN-1.6.15.21042-win32-svn-1.6.16.msi

http://tortoisesvn.net/downloads.html

http://sourceforge.net/projects/tortoisesvn/files/?source=navbar

直接安装

 

3)配置服务端

1.安装版本控制库

路径自己定,我的做法是在D盘上新建一个svn文件夹,双击打开它,然后在里面点击右键,[TotoiseSVN]->[Create Repository here]进行创建,版本库模式指定为默认的即可。Repository创建完毕后会在目录下生成若干个文件和文件夹,conf目录是用来设置管理的目录;db目录就是所有版本控制的数据文件;hooks目录放置hook脚本文件的目录;locks用来放置Subversion文件库锁定数据的目录, 用来追踪存取文件库的客户端;format文件是一个文本文件,里面只放了一个整数,表示当前文件库配置的版本号。

(本步骤也可以用命令行来完成:svnadmin create D:/svn/repository)

2.设置版本控制库权限,打开/conf/目录,打开svnserve.conf找到一下两句:

# [general]

# password-db = passwd

去之每行开头的#,其中第二行是指定身份验证的文件名,即passwd文件

同样打开passwd文件,将

# [users]

# harry = harryssecret

# sally = sallyssecret

将# [users]开头#字符去掉,这是设置用户,一行一个,存储格式为“用户名 = 密码”,如可插入一行:wang=123,即为系统添加一个用户名为wang,密码为123的用户

3.启动服务器端并将svn设为系统服务,由于win7的安全权限问题,安装系统服务时会出现“[sc] openSCManager 失败 5 拒绝 ”错误。

解决方案:

    打开cmd  输入

      sc create svnser binPath= "D:/Program Files/Subversion/bin/svnserve.exe --service --root D:/svn"//服务指定版本库

    回车;(注:“=”前不得有空格,后必须有空格。 svnser为自定义的服务名称)

不提示错误即为成功。

4、启动后在计算机->管理->服务和应用程序->服务->找到svnser,右键属性找到启动类型改为自动,这样每次开机它都会自动运行了)

5.访问svn,在桌面上点右键[TotoiseSVN]->[Repo-browser]在地址栏里输入svn://localhost/,这样就可以访问svn了,到这里也就完成了本地svn服务器端和客户端的安装。

 

4)TortoiserSVN客户端操作

1、浏览SVN服务器上的数据

URL of repository输入“svn://localhost/” 里面有子文件夹

需要注意的是,这一步操作可以完全在另一台安装了TortoiseSVN的主机上进行。例如运行svnserve的主机的IP是133.96.121.22,则URL部分输入的内容就是

svn://133.96.121.22/”。

2、客户端操作 CheckOut  update import add

 两种方法可以将新文件引入Subversion版本库:svn import和svn add

通过TortoisSVN import 其实也是add可以添加所有的,CheckOut可以指定N多目录(在Checkout目录下 TortoiserSVN的工能项增多。

 

 

4、SVN注意点

 

 SVN和CVS一样会产生在工作目录下的.svn文件,该文件影响到文件夹或盘符的图标。

删掉后图标恢复正常

 

 

5、备份还原

方式一: 版本库文件的整个备份

方式二: 使用svn命令

除去最常用的update,checkout, commit等操作, 最常见的就是对svn版本库的备份和还原。

 备份策略
svn备份一般采用三种方式:
在命令行中使用命令

1)svnadmin dump

2)svnadmin hotcopy

3)svnsync.

注意,svn备份不宜采用普通的文件拷贝方式(除非你备份的时候将库暂停),如copy命令、rsync命令。

笔者曾经用 rsync命令来做增量和全量备份,在季度备份检查审计中,发现备份出来的库大部分都不可用,因此最好是用svn本身提供的功能来进行备份。

优缺点分析:

==============

第一种svnadmin dump是官方推荐的备份方式,优点是比较灵活,可以全量备份也可以增量备份,并提供了版本恢复机制。

  缺点是:如果版本比较大,如版本数增长到数万、数十万,那么dump的过程将非常慢;备份耗时,恢复更耗时;不利于快速进行灾难恢复。

  个人建议在版本数比较小的情况下使用这种备份方式。

第二种svnadmin hotcopy原设计目的估计不是用来备份的,只能进行全量拷贝,不能进行增量备份;

   优点是:备份过程较快,灾难恢复也很快;如果备份机上已经搭建了svn服务,甚至不需要恢复,只需要进行简单配置即可切换到备份库上工作。

   缺点是:比较耗费硬盘,需要有较大的硬盘支持(俺的备份机有1TB空间,呵呵)。

第三种svnsync实际上是制作2个镜像库,当一个坏了的时候,可以迅速切换到另一个。不过,必须svn1.4版本以上才支持这个功能。

  优点是:当制作成2个镜像库的时候起到双机实时备份的作用;

  缺点是:当作为2个镜像库使用时,没办法做到“想完全抛弃今天的修改恢复到昨晚的样子”;而当作为普通备份机制每日备份时,操作又较前2种方法麻烦。      
 

备份的命令 写道

全备份:使用svnadmin dump或svnadmin hotcopy或svnsync来做,

hotcopy:

svnadmin hotcopy path/to/repository path/to/backup –clean-logs
svnadmin hotcopy d:\svnroot\project1 d:\svnrootbak\project1 

dump:

svnadmin dump 版本库路径及名称 –revision 导出的版本号> 导出的命名

增量备份:使用svnadmin dump的–incremental选项来实现

svnadmin dump 版本库路径及名称 –revision 上次导出的版本号:到本次要导出到的版本号 –incremental > 导出的命名

一个技巧:如果你有一个较大的Subsersion版本库而你又想用最少的空间来将它备份下来,用这个命令(请将/repo替换成你的版本库路径)吧:

svnadmin dump –deltas /repo |bzip2 |tee dump.bz2 | md5sum >dump.md5

分步解释:最重要的一步是 -deltas,将消耗更多的CPU资源,但拥有更有效的差异存储办法。

bzip2压缩方案比gzip慢,但换来的更好的压缩率。

更有趣的是,tee方法将压缩的数据流转向到文件dump.bz2,同时将其输出到标准输出,后者有转向给了MD5摘要计算工具。
 

还原命令 写道
还原版本:svnadmin load 要恢复的版本库路径及名称 < 导出的命名

svnadmin hotcopy path/to/repository path/to/backup –clean-logs
 

   我的svn是搭建在windows上的,用visual svn挺方便, 参考网上的bat备份svn的命令,我写了一个备份和还原全部版本库的bat脚本,

   备份,需要把脚本放在版本库根目录下运行,例如dumpall.bat,  不指定参数则备份到当前目录下,否则备份到指定目录:

 

@ECHO OFF
SET DUMPTO_DIR="."
if  not "%1" == ""  (
echo Back up all to %1
SET DUMPTO_DIR=%1
)

SET VAR_DATE=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
dir /B /AD > DIRS

IF EXIST DUMP_FILES (
DEL /Q DUMP_FILES
)
FOR /F %%i IN (DIRS) DO (
SET REPOS_NAME=%%i
CALL :DUMP_REPOS
)
SET REPOS_NAME=

ECHO.
IF EXIST %DUMPTO_DIR%\Repos_%VAR_DATE%.zip (
echo Delete existing compressed dump file
del %DUMPTO_DIR%\Repos_%VAR_DATE%.zip
)
ECHO Compressing dump files...
zip  -j %DUMPTO_DIR%\Repos_%VAR_DATE%.zip %DUMPTO_DIR%\*.bin

ECHO Delete dump files...
FOR /F %%i IN (DUMP_FILES) DO (
DEL /Q %DUMPTO_DIR%\%%i
)

DEL /Q DIRS
DEL /Q DUMP_FILES
SET DUMPTO_DIR=

ECHO Successed.
GOTO :EOF

::==== Functions ====
:DUMP_REPOS
SET DUMP_FILE=%REPOS_NAME%.bin
ECHO Dumping repository ^"%REPOS_NAME%^" ...
svnadmin dump ^"%REPOS_NAME%^" -q > %DUMPTO_DIR%/%DUMP_FILE%
IF %errorlevel%==0 (
ECHO %DUMP_FILE% >> DUMP_FILES
) ELSE (
DEL /Q %DUMP_FILE%
ECHO Dump ^"%REPOS_NAME%^" failed.
)
SET DUMP_FILE=

ECHO.


 

@ECHO OFF
SET DUMPTO_DIR="."
if  not "%1" == ""  (
echo Back up all to %1
SET DUMPTO_DIR=%1
)

SET VAR_DATE=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
dir /B /AD > DIRS

IF EXIST DUMP_FILES (
DEL /Q DUMP_FILES
)
FOR /F %%i IN (DIRS) DO (
SET REPOS_NAME=%%i
CALL :DUMP_REPOS
)
SET REPOS_NAME=

ECHO.
IF EXIST %DUMPTO_DIR%\Repos_%VAR_DATE%.zip (
echo Delete existing compressed dump file
del %DUMPTO_DIR%\Repos_%VAR_DATE%.zip
)
ECHO Compressing dump files...
zip  -j %DUMPTO_DIR%\Repos_%VAR_DATE%.zip %DUMPTO_DIR%\*.bin

ECHO Delete dump files...
FOR /F %%i IN (DUMP_FILES) DO (
DEL /Q %DUMPTO_DIR%\%%i
)

DEL /Q DIRS
DEL /Q DUMP_FILES
SET DUMPTO_DIR=

ECHO Successed.
GOTO :EOF

::==== Functions ====
:DUMP_REPOS
SET DUMP_FILE=%REPOS_NAME%.bin
ECHO Dumping repository ^"%REPOS_NAME%^" ...
svnadmin dump ^"%REPOS_NAME%^" -q > %DUMPTO_DIR%/%DUMP_FILE%
IF %errorlevel%==0 (
ECHO %DUMP_FILE% >> DUMP_FILES
) ELSE (
DEL /Q %DUMP_FILE%
ECHO Dump ^"%REPOS_NAME%^" failed.
)
SET DUMP_FILE=

ECHO.

 

   还原:cd到备份目录,再运行,例如loadall.bat, 如果不指定参数,则认为当前目录就是备份的目录,否则从指定目录进行还原。另外, 如果是备份到了压缩包,需要先解压。

 

SET VAR_IS_EMPTY_DIR=TRUE

SET LOAD_DIR=".";
IF NOT "%1"=="" (
SET LOAD_DIR=%1
)

echo %LOAD_DIR%

SET VAR_IS_EMPTY_DIR=
dir /B /A-D %LOAD_DIR%\*.bin > DUMP_FILES
IF "%errorlevel%"=="0" (
ECHO Finded dump file.
) ELSE (
ECHO Error : Can not find dump file.
DEL DUMP_FILES
GOTO :EOF
)
FOR /F %%i IN (DUMP_FILES) DO (
SET REPOS_FILE=%%i
CALL :LOAD_REPOS
)
SET REPOS_FILE=
DEL /Q DUMP_FILES
ECHO Successed.
GOTO :EOF
::==== Functions ====
:LOAD_REPOS
SET REPOS_NAME=%REPOS_FILE:~0,-4%
mkdir %REPOS_NAME%
ECHO %REPOS_NAME%
ECHO Loading repository ^"%REPOS_NAME%^" ...
svnadmin create %REPOS_NAME%
svnadmin load -q %cd%\%REPOS_NAME% < %LOAD_DIR%/%REPOS_FILE%
IF %errorlevel%==0 (
ECHO %DUMP_FILE% >> DUMP_FILES
) ELSE (
RMDIR /Q %REPOS_NAME%
ECHO Load ^"%REPOS_NAME%^" failed.
)
SET REPOS_NAME=
ECHO.


 

    再配合一下计划任务, 就可以实现定时备份了。

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: