您的位置:首页 > 其它

SVN使用 && SVN服务器的搭建

2009-11-23 10:39 656 查看
SVN是WIN和linux下都可以使用的软件版本控制工具。

(1)以实际在XP下使用的经历来说明使用法则。

1,如果误把不需受控的文件(如编译生成文件)上传跟踪了,参照5。

2,从SVN服务器上下载code,就是下载一个最新的版本在工作目录机上使用(在XP中是点击右键SVN CHECKOUT,在LINUX中用终端命令),然后把自己的code改动加上去之后,加上标识上传至服务器,即成为最新的code。(checkout之前要先import,为了避免checkout时多一级目录或者少一级目录,路径要注意。比如点击右键mediatek全部Import后,再check时进入空的mediatek目录点选版本的mediatek)

3,其实服务器主体部分只有一个版本,上传是追加式,每次以一定的版本号只保存改动的部分上去,不过在下载使用时对用户是透明的。否则每次上传都是完整版本会占用较大服务器空间。

4,如果自己改动的跟服务器上的同名文件改动有冲突,或者服务器上是最新的文件,那就把服务器上的文件下载到本地(可用export到其他目录),合并改动加上去并确认后再上传,而不致于会冲突。

5,删除服务器上的版本库的某个多余目录,直接点击右键访问repo browser里面删除指定版本库目录就行了。后面,在自己目录执行svn update,它会重新恢复后并再删除多余目录。如果不这样做,在commit时会提示在SVN版本库中删除的那些文件missing(本地SVN提供的消息),因为SVN对所有操作都会记录,包括删除版本库文件。另一种方法标准些:就是不管服务器上多余的上传,在本地没有多余文件的目录下commit,SVN会记录文件的missing,再update时就不会有那些多余的文件下载下来。

6,如果一次要添加的文件在不同的文件夹内,切换到共同的上层目录,在该层目录用SVN COMMIT并选择属于同一批次的改动文件即可。

8,SVN 本地更新时,由于一些操作中断更新,如磁盘空间不够,用户取消。可能会造成本地文件被锁定的情况。一般出现这种情况,可以使用SVN clean up来清除锁定。

10,如果使用SVN自带的比较查看器不太习惯,可以使用通用的BC来查看,也就是用外部的比较查看器。设置方法是:右键-》SVN-》External Programmes-》Diff Viewer,选择external之后,就可以选择C盘特定的应用软件EXE就行了。

11,如果不确定某个目录是不是SVN属性,也就是不确定某个目录是不是后期编译生成的,不用上传的。只需要点击右键-》SVN-》Repo-Browser,在里面输入SVN URL路径,之后可以核对哪些目录是SVN管理的。

12,当上传文件或者文件夹后,最终想使用之前的某个版本,点击文件右键SVN后,点击update to version,输入具体想恢复的版本号,就可以了(也可以svn up -r 版本号来更新文件)。但是如果想把当前恢复的这个上传,则不会提示有更新(因为svn记录了是恢复旧的提交过的文件)。此时备份这些文件,再把目录文件更新到最新后(只有这样才会提示更新,svn需要记录这个),再用备份的替换掉,再上传就行。类似的,如果恢复到旧的某个文件之后,用服务器上最新的文件替换掉这个旧的文件,提交时仍然会提示更新,因为根据的是SVN记录。

这里补充:revert与update的本质区别是,revert是在本地copy原来版本的基础上进行的修改,若原来本地copy的版本为最新,可以直接commit;update只是将本地copy更新到一个指定的版本,若更新到的不是最新版本,不能进行commit,因为时间是以前的。

13,SVN客户端如果有异常使用,需要清掉默认的配置时,方法是SVN右键,点击里面的savedata里全部clear掉就行。

(2)XP系统我们很容易操作SVN,以下是linux终端常用的SVN命令说明。

1,svn update(up):更新工作拷贝到本机,如果想更新到中间的某个版本(比如svn 103): svn update -r 103 mediatek/custom/XXX.C,此后这个文件是无法提交的,因为是旧的时间戳。另一方面,在执行svn co时由于空间不够的原因,过程终止了。在重新腾挪出必要的空间之后,再执行svn up就可以继续之前没有完成的check out过程。实例:

$ svn update

U foo.c

U bar.c

Updated to revision 2.

这种情况下,其他人在你上次更新之后提交了对foo.c和bar.c的修改,因此Subversion更新来引入这些更改。认真检查svn update的输出,一个字母显示在每一个项目之前,来让你知道Subversion对你的工作拷贝做了什么操作。

U foo:文件foo更新了(从服务器收到修改)。

A foo:文件或目录foo被添加到工作目录。

D foo:文件或目录foo在工作目录被删除了。

R foo:文件或目录foo在工作目录已经被替换了,这是说,foo被删除,而一个新的同样名字的项目添加进来,它们具有同样的名字,但是版本库会把它们看作具备不同历史的不同对象。

G foo:文件foo接收到版本库的更改,你的本地版本也已经修改,但改变没有互相影响,Subversion成功的将版本库和本地文件合并,没有发生任何问题。

C foo:文件foo的修改与服务器冲突,服务器的修改与你的修改交迭在一起,不要恐慌,这种冲突需要人(你)来解决,我们在后面的章节讨论这种情况。

svn up的一个参数用法svn up --accept tf,直接用他人的忽略掉自己的修改。配合at定时命令,可以定时更新代码来发布版本。

2,svn add 做出添加。

svn add foo:预定将文件、目录或者符号链foo添加到版本库 (如果添加的目录或者文件包含有lib、bin、图片等非文本文件时一定记得带 --no-ignore参数)svn add xxxx --no-ignore 。注意:还需要用svn commit上传到服务器才算完。

3,svn status,svn diff,svn revert:检验修改。当你完成修改,你需要提交他们到版本库,但是在此之前,检查一下做过什么修改是个好主意,你也可以发现你不小心修改的文件,给了你一次恢复修改的机会。

svn status:如果你在工作拷贝的顶级目录运行不带参数的svn status命令,它会检测你本地做的所有的文件或目录的修改,服务器上是否有更改是不管的。带M标识意味着本地有修改,带!标识意味本地文件已删除。

svn diff:你可以通过不带参数的svn diff精确的找出你所做的修改。通过该命令可以比较本地与特定版本号的某文件的差别,命令如下:svn diff -r 679 platform/mt6573/uboot/mt6573_bat.c,就是比较本地与679版本号的差别;如果是比较本地与最新版本号的差别,将679改成HEAD即可。

$ svn revert foo

Reverted 'foo'

如果要将正在使用的某个文件恢复到服务器的最老的状态,我采用的方法是以XP文件夹的方式访问文件所在文件夹,然后显示show log。在目录列表中找到需要恢复的版本号,由于每次提交不止一个文件,那么可以在下方的窗口点击具体文件,右键选择revert changes from this reversion,有可能该处会显示存在merge冲突;另外也可以采取在上方的窗口点击revert to this revision恢复全部的提交文件,再逐个恢复除所需要文件之外的其他文件。

4,svn commit:提交你的修改。发送所有的修改到版本库。提交之后,会提示添加注释信息,编辑好评注,按ctrl+x保存,按回车即可;也可以在提交时直接加注释,用svn commit -m "LogMessage" PATH。如果提交多个不同目录下的文件,PATH 可以包含多个文件全路径信息,中间以空格隔开。例如:svn ci -m "PD1208:修改摄像不能手动对焦" res/layout-mdpi/preview_frame_video.xml res/layout-sw600dp/preview_frame_video.xml
src/com/android/camera/VideoCamera.java,提交多个文件时,如果一个文件没有提交成功,提示svn: E200009: Commit failed (details follow):,整个提交过程都是失败的,切记勿认为只有那一个文件失败。

5,svn cleanup:如果Subversion的操作中断了(举个例子:进程被杀死了,机器死掉了),日志文件会保存在硬盘上,通过重新执行日志文件,Subversion可以完成上一次开始的操作,你的工作拷贝可以回到一致的状态。这就是svn cleanup所作的:它查找工作拷贝中的所有遗留的日志文件,删除进程中工作拷贝的锁。svn status将会使用L 显示锁定的项目:

$ svn status

L somedir

6,svn co:与svn checkout一样,典型用法:svn co <url> [directory]。如:svn checkout https://svn.test.cn/book/network/ 。如果想checkout中间svn 103的版本来验证问题:svn checkout svn://10.0.x.x/project_name/trunk -r 103

7,svn log:查看目录下的SVN工具记录的log信息。

8,svn list:列出某个SVN目录管控的文件列表

9,svn 1.7以上出现svn: E200033: database is locked的结局方法。由于某些svn操作导致db被锁住了,出现svn: E200033: database is locked, executing statement 'RELEASE s0'。解决方式:

$ cd /your project path/.svn
$ mv wc.db wc.db.old         
$ sqlite3 wc.db.old          
sqlite> .backup main wc.db   
sqlite> .exit

相当于重新生成了一个db。

(3)使用中的一些问题和错误的解决

1,有时使用时,电脑工作目录workspace文件夹左下角图标显示不正常(绿勾,感叹号等都不见了),该怎么办?方法如下:默认的TSVN是不需要特别设置的。需检查一下这个设置有没有开:右键->TSVN->设置->样式->重叠图标->Status cache,里面有三个选项:1Default 2Shell 3None。如果是前面两个,应该就有svn图标,如果是none,就没有。个人实际使用时,要设定SHELL才行。

3,使用SVN时,有可能会出现错误:containing working copy admin area is missing。这种错误出现的原因是SVN信息目录出现损坏,比如:

svn: Directory 'E:/DEV/workspace/NH-iTV-App-VOD-PublishServer-0.1-alpha-3/classes/test/cn/.svn' containing working copy admin area is missing 。

解决方法:先删掉报错的文件夹,如'E:/DEV/workspace/NH-iTV-App-VOD-PublishServer-0.1-alpha-3/classes/test/cn,再同步,执行更新操作!

4,update时出现错误提示需要执行clean up,而我执行clean up时,又出现“Subversion reported an error while doing a cleanup!” '**' is not a working copy directory ”,此时要按步骤3的方法,手工删掉一些无用的目录,再重新Update就解决了。

5,svn up Conflict discovered in 'Makefile'. Select: (p) postpone, (df) diff-full, (e) edit, (mc) mine-conflict, (tc) theirs-conflict, (s) show all options: p C Makefile Updated to revision 5. Summary of conflicts: Text conflicts: 1。以上选项的意思是:p表示让文件在更新完成之后保持冲突状态;mc表示以本机文件为主,丢弃新从服务器接收的变更,之后自己再去手动修改合并上传,用于自己改的文件;tc表示丢弃你对文件的本地修改,只使用从服务器新接收的变更,用于不是自己改的文件。

选P后,由于冲突存在,会导致编译不过。就算把代码删掉重下,还是编译不过的(SVN会记录冲突状态)。必须解决冲突后,才能继续。如何解决冲突呢?使用commit查看冲突的文件,将这些文件revert到之前的状态,再update后再编译就可以了。

6,在XP中使用SVN时,点击某个文件再右键点击“SVN LOG”,可得知该文件的更新历史记录。其中的黑粗体版本记录即当前本机的版本,往上可以更新,往下可以恢复。如果当前文件不是最新,右键点击该文件时,可以看到跟网上的最新比较,也可以看到previos diff跟前一版本比较。另一方面,SVN LOGMESSAGE 框里面,上面的框可以获得某个版本跟当前版本的比较,下面的框可以获得某个版本跟服务器根版本的比较。

7,在使用svn提交时,TP所用的.a文件老是不提醒提交,服务器上也没有。此时只需在设置中的ignore选项删掉.a文件的匹配,就可以了。如右下图



当然必要的筛选还是要加上,避免过多生成文件的提醒。

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

很多时候我们需要进行简单的代码管理,用SVN要方便于GIT,尽管前者的库有压缩但是耗磁盘空间。步骤如下:

(1)安装subversion,命令是apt-get install subversion。安装完毕后,执行svnserve --version,会返回如下等信息:

svnserve,版本 1.6.17 (r1128011)

编译于 Dec 17 2011,16:12:52

备注:默认的ubuntu10.04 12.04等安装的都是1.6版本,如果与服务器端SVN不匹配的话,导致下下来的CODE编译会有错误。解决方法是安装1.7版本的SVN。

1、卸载原来的svn:sudo apt-get remove subversion

2、添加1.7资源库:sudo apt-add-repository ppa:dominik-stadler/subversion-1.7

3、更新apt:sudo apt-get update

4、安装依赖的java库:sudo apt-get install libsvn-java

5、安装新版svn:sudo apt-get install subversion

6、确认安装版本:svn --version


如果升级完后还是1.6的,可以参照如下过程更改下source.list文件后再试。添加Subversion PPA,再更新就可以了。具体部署如下:

sudo vim /etc/apt/source.list, 添加

deb http://ppa.launchpad.net/svn/ppa/ubuntu precise main

deb-src http://ppa.launchpad.net/svn/ppa/ubuntu precise main

再apt-get update再安装

如果想用SVN1.8,方法是:

1. 在/etc/apt/sources.list添加ppa的源,可以在末尾添加如下两行:

deb http://ppa.launchpad.net/dominik-stadler/subversion-1.8/ubuntu/ precise main

deb-src http://ppa.launchpad.net/dominik-stadler/subversion-1.8/ubuntu/ precise main

2. 更新仓库 sudo apt-get update

3. 安装svn sudo apt-get install subversion subversion-tools

如果想在1.8的基础上卸载掉它,继续用1.7。在卸掉1.8并继续1.7的安装过程时,会提示如下的疑似残留




再用sudo apt-get remove subversion libsvn1把libsvn1卸载掉后继续安装,再执行svn --version后又提示svn: error while loading shared libraries: libserf-1.so.0: cannot open shared object file: No such file or directory(一波三折),参照http://blog.sina.com.cn/s/blog_586c261a0101i2fi.html解决。

(2)配置SVN

A,建立版本库目录,mkdir -p /opt/svndata,这个是SVN的根,里面可以具体建立很多不同的工程版本库

B,建立版本库,svnadmin create /opt/svndata/project1,执行此命令后svn自动在目录下添加必须的配置文件,有:conf db format hooks locks README.txt.六个文件。注意:工程CODE需使用import等命令将文件或者代码导入版本库。

C,修改版本库配置文件

修改conf/svnserve.conf,修改或者去掉#屏蔽:

[general]

anon-access = none # 使非授权用户无法访问

auth-access = write # 使授权用户有写权限

password-db = passwd # 指明密码文件路径

authz-db = authz # 访问控制文件

其它采用默认配置,各语句都必须顶格写,左侧不能留空格,否则会出错"错误svnserve.conf:12: Option expected"。如果不修改该文件,会在svn import时提示认证错误。

D,配置用户

修改conf/authz,插入以下内容,表明可操作用户

[groups]

admin_group=zhangcheng,zhangxinyang,hutaiyun

...............

[external:/]

@admin_group = rw

列出对各用户和目录的授权。包括只读r,读写rw。没有列出的用户,则不允许访问。也可不修改

E,配置用户密码,在***CODEBASE和下载CODEBASE时都会用到

修改conf/passwd,插入如下内容

[users]

zhangcheng = 123456

zhangxinyang = 123456

hutaiyun = 123456

可以添加多个,此为用户名密码对。

(3)启动SVN服务

在终端执行svnserve -d -r /opt/svndata,启动svn服务。-d指明以守护模式运行,svn自动在3690端口监听,3690是默认端口;-r选项用来指定svn服务的根目录(绝对路劲),这样用户后面就可以使用相对路径访问,不用提供完整路径;而且不用管子工程。也即IP地址后面跟子目录就行了,如svn://10.0.9.9/project1。

killall svnserve是关掉svn服务,必要的时候可以先用这个关掉再重启

(4)检查端口

在终端执行:netstat -ntlp|grep 3690。回显tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 3309/svnserve说明成功。

(5)以下分别提示本地和带IP的两种访问方式。此后会提示输入账户名和密码,可以看到IMPORT代码到版本库的过程。之后就可以用来检出(checkout)代码了,如下:

svn import project/ file:///home/svn/project/ -m "initial test"

svn co file:///home/svn/project/



svn import external/ svn://10.0.9.9/external -m "tag" --no-ignore

svn co svn://10.0.9.9/external

如果是用https的,路径要用https,比如:svn import alps/ https://192.168.1.199/svn/trunk -m "create codebase" --no-ignore

注意: --no-ignore 选项参数非常重要,否则可能导致工程缺少某些二进制文件,会出现各种各样的问题!!!另外,在建立codebase和co base的时候,使用/home/svn下的顶层目录使用,如果中间有其他自建文件夹,也会提示认证失败。

(6)版本库建立后,以后可能需要根据不同项目建立不同的分支,所以一般code不是直接导入到svnadmin create /SVN_Base_DIR/project_name,而是在svnadmin create /SVN_Base_DIR/project_name下面再通过svn客户端创建下面几个文件夹:trunk(主干目录)、branches(给以后做分支预留),导入code时候导入到trunk中:svn import local_project_dir svn://10.0.x.x/project_name/trunk
-m "log msg" --no-ignore

以后基于trunk创建分支就很容易,在svn客户端使用copy to就可以了。

参考原文:http://svndoc.iusesvn.com/svnbook/svn.tour.cycle.html

参考原文:http://bbs.iusesvn.com/thread-762-1-8.html

参考原文:http://lhflinux.blog.51cto.com/1961662/506243

参考原文:http://blog.sina.com.cn/s/blog_4b93170a0100mkad.html

参考原文:http://www.233.com/linux/fudao/20100125/093125680-3.html

参考原文:http://blog.csdn.net/reipeng/article/details/22802287
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: