Svn简介:
Svn的全名是Subversion,它使用服务端—客户端的结构,当然服务端与客户端可以都运行在同一台服务器上。在服务端是存放着所有受控制数据的Subversion仓库,另一端是Subversion的客户端程序,管理着受控数据的一部分在本地的映射(称为工作副本)。在这两端之间,是通过各种仓库存取层(RepositoryAccess,简称RA)的多条通道进行访问的。这些通道中,可以通过不同的网络协议,例如HTTP、SSH等,或本地文件的方式来对仓库进行操作。
Subversion是一种开放源码的全新版本控制系统,支持可在本地访问或通过网络访问的数据库和文件系统存储库。不但提供了常见的比较、修补、标记、提交、回复和分支功能性,Subversion还增加了追踪移动和删除的能力。此外,它支持非ASCII文本和二进制数据,所有这一切都使Subversion不仅对传统的编程任务非常有用,同时也适于Web 开发、图书创作和其他在传统方式下未采纳版本控制功能的领域.
Subversion的官方网站是:http://subversion.tigris.org/
大部分的发行版都已经提供Subversion套件,ubuntu下安装subversion客户端:
sudo apt-get installsubversion
使用Subversion
Subversion一般使用两种后台服务模式:一种是其自己实现的svnserve,可以通过svn协议访问,另一种是借助mod_dav_svn模块,由Apachehttp服务器来实现,然后通过HTTP或HTTPS协议来访问。
1、通过svn协议访问
svn协议
客户端若要通过svn协议访问仓库,必须在存放仓库的机器上运行svnserve服务程序。启动该程序后,会监听在3690端口,以响应客户端的访问工作。
2、通过HTTP协议访问版本库
通过HTTP协议访问版本库是Subversion的亮点之一,这种方式具备许多svnserve服务器所没有的特性,使用上更加灵活。
以下是svn常用的一些命令,详细请看http://www.subversion.org.cn/svnbook/1.1/index.html
-
将文件checkout到本地目录
命令:checkout或co
示例:
I、svn co http://路径(目录或文件的全路径) [本地目录全路径] --username 用户名--password 密码
II、svn co svn://路径(目录或文件的全路径) [本地目录全路径] --username 用户名--password 密码
III、svn checkout http://路径(目录或文件的全路径) [本地目录全路径] --username 用户名
IV、svn checkout svn://路径(目录或文件的全路径) [本地目录全路径] --username 用户名
注意事项:
1、如果不带--password参数传输密码的话,会提示输入密码,建议不要用明文的--password选项。推荐使用示例c、d,其执行之后会提示输入密码
2、其中username 与password前是两个短线,不是一个。
3、若不指定本地目录全路径,则检出到当前目录下。
例子:
svn cosvn://192.168.0.6/test /home/test --username xxx
svn cohttp://192.168.0.6/test/testapp --username xxx
svn checkoutsvn://192.168.0.6/ test /home/ test --username xxx
svn checkouthttp://192.168.0.3/test/testapp --username xxx
2、添加新文件
命令:svn add
svn add 文件名
注:告诉SVN服务器要添加文件了,还要用svncommint -m真实的上传上去!
例子:
I、svnadd test.c <-添加test.c
svn commint -m “添加测试用test.c“test.php
II、svnadd *.c <-添加当前目录下所有的c文件
svn commint -m“添加测试用全部c文件“*.c
3、导出(导出一个干净的不带.svn文件夹的目录)
命令:svn export
svn export [-r 版本号] http://路径(目录或文件的全路径)[本地目录全路径] --username 用户名
svn export [-r 版本号] svn://路径(目录或文件的全路径)[本地目录全路径] --username 用户名
svn export 本地检出的(即带有.svn文件夹的)目录全路径 要导出的本地目录全路径
注:第一种从版本库导出干净工作目录树的形式是指定URL,
如果指定了修订版本号,会导出相应的版本,
如果没有指定修订版本,则会导出最新的,导出到指定位置。
如果省略本地目录全路径,URL的最后一部分会作为本地目录的名字。
第二种形式是指定本地检出的目录全路径到要导出的本地目录全路径,所有的本地修改将会保留,但是不在版本控制下(即没提交的新文件,因为.svn文件夹里没有与之相关的信息记录)的文件不会拷贝。
例子:
svn exportsvn://192.168.0.3/ test /home/ test --username xxx
svn exporthttp://192.168.0.3/test/testapp --username xxx
svn export /home/ test/home/ testbak
4、将改动的文件提交到版本库
命令:svn commint或svn ci
svn commint -m “提交备注信息文本“ [-N] [--no-unlock] 文件名
svn ci -m “提交备注信息文本“ [-N] [--no-unlock] 文件名
svn commit -m"LogMessage" [-N] [--no-unlock]PATH(如果选择了保持锁,就使用–no-unlock开关)
必须带上-m参数,参数可以为空,但是必须写上-m
例子:
svn commint -m“提交当前目录下的全部在版本控制下的文件“* <-注意这个*表示全部文件
svn commint -m“提交测试用test.c“test.c
svn commint -m“提交测试用test.c“-N --no-unlock test.c <-保持锁就用–no-unlock开关
svn ci -m“提交当前目录下的全部在版本控制下的文件“* <-注意这个*表示全部文件
svn ci -m “提交测试用test.c“test.c
svn ci -m “提交测试用test.c“-N --no-unlock test.c <-保持锁就用–no-unlock开关
5、更新文件
命令:svn update或svn up
svn update -r 修正版本 文件名
svn update 文件名
例子:
svn update <-后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本
svn update -r 1300test.c <-将版本库中的文件test.c 还原到修正版本(revision)1300
svn update test.c <-更新与版本库同步。
提交的时候提示过期冲突,需要先update 修改文件,
然后清除svnresolved,最后再提交commit。
6、删除文件
命令:svn delete或svn del, svnremove, svnrm
svn delete svn://路径(目录或文件的全路径)-m “删除备注信息文本”
推荐如下操作:
svn delete 文件名
svn ci -m “删除备注信息文本”
例子:
svn deletesvn://192.168.1.1/ trunk /main /test.c -m “删除测试文件test.c”
推荐如下操作:
svn delete test.c
svn ci -m“删除测试文件test.c”
svn delete path -m"delete test fle"
例如:svndelete svn://192.168.1.1/ trunk /main/test.c -m "delete testfile"
或者直接svndelete test.c 然后再svnci -m ‘delete test file‘,推荐使用这种
7、加锁/解锁
命令:svn lock
svn lock -m “加锁备注信息文本“ [--force] 文件名
svn unlock 文件名
svn lock -m"LockMessage" [--force] PATH
例如:svnlock -m "lock test file" test.c
svn unlock PATH
例子:
svn lock -m“锁信测试用test.c文件“test.c
svn unlock test.php
8、比较差异
命令:svn diff
svn diff 文件名
svn diff -r 修正版本号m:修正版本号n 文件名
例子:
svn diff test.php<-将修改的文件与基础版本比较
svn diff -r 200:201test.php<-对 修正版本号200和修正版本号201 比较差异
svn diffpath(将修改的文件与基础版本比较)
例如:svndiff test.php
svn diff -r m:npath(对版本m和版本n比较差异)
例如:svndiff -r 200:201 test.php
简写:svndi
9、将两个版本之间的差异合并到当前文件
命令:svnmerge
svn merge -r m:n path
例如:svnmerge -r 200:205 test.php(将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下)
10、查看文件或者目录状态
命令:svnstatus 或svnst
svn st 目录路径/名
svn status 目录路径/名<-目录下的文件和子目录的状态,正常状态不显示
【?:不在svn的控制中; M:内容被修改;C:发生冲突;
A:预定加入到版本库;K:被锁定】
svn -v 目录路径/名
svn status -v 目录路径/名<-显示文件和子目录状态
【第一列保持相同,第二列显示工作版本号,
第三和第四列显示最后一次修改的版本号和修改人】
注:svnstatus、svndiff和svn revert这三条命令在没有网络的情况下也可以执行的,
原因是svn在本地的.svn中保留了本地版本的原始拷贝。
1)svnstatus path(目录下的文件和子目录的状态,正常状态不显示)
【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定】
2)svnstatus -v path(显示文件和子目录状态)
第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人.
注:svnstatus、svndiff和svnrevert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝.
简写:svnst
11、查看日志
命令:svn log
svn log 文件名
svn log path
例子:
svn log test.php<-显示这个文件的所有修改记录,及其版本号的变化
12、查看文件详细信息
命令:svn info
svn info 文件名
svn info path
例子:
svn info test.php
13、SVN帮助
命令:svn help
svn help<-全部功能选项
svn help ci<-具体功能的说明
14、查看版本库下的文件和目录列表
命令:svn list或svn ls
svn list svn://路径(目录或文件的全路径)
svn ls svn://路径(目录或文件的全路径)
例子:
svn listsvn://192.168.0.3/test
svn lssvn://192.168.0.3/test <-显示svn://192.168.0.3/test目录下的所有属于版本库的文件和目录
15、创建纳入版本控制下的新目录
命令:svn mkdir
svn mkdir 目录名
svn mkdir -m "新增目录备注文本" http://目录全路径
创建版本控制的目录.
1、每一个以工作副本PATH 指定的目录,都会创建在本地端,并且加入新增
调度,以待下一次的提交.
2、每个以URL指定的目录,都会透过立即提交于仓库中创建.
在这两个情况下,所有的中间目录都必须事先存在.
例子:
svn mkdir newdir
svn mkdir -m "Makinga new dir." http://192.168.0.3/test/newdir
注:添加完子目录后,一定要回到根目录更新一下,不然在该目录下提交文件会提示“提交失败”
svn update
注:如果手工在checkout出来的目录里创建了一个新文件夹newsubdir,
再用svnmkdir newsubdir命令后,SVN会提示:
svn:尝试用“svn add”或“svn add --non-recursive”代替?
svn:无法创建目录“hello”:文件已经存在
此时,用如下命令解决:
svnadd --non-recursive newsubdir
在进入这个newsubdir文件夹,用ls-a查看它下面的全部目录与文件,会发现多了:.svn目录
再用svn mkdir -m "添hello功能模块文件"svn://192.168.0.3/test/newdir/newsubdir 命令,
SVN提示:
svn:File already exists: filesystem ‘/data/svnroot/test/db‘, transaction‘4541-1‘,
path‘/newdir/newsubdir ‘
16、恢复本地修改,恢复原始未改变的工作副本文件
命令:svn revert
svn revert [--recursive] 文件名
注意:本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复被删除的目录。
例子:
svn revert foo.c <-丢弃对一个文件的修改
svn revert --recursive. <-恢复一整个目录的文件,.为当前目录
17、代码库URL变更,把工作拷贝更新到别的URL
命令:svn switch或svnsw
svn switch http://目录全路径 本地目录全路径
例子:
svn switchhttp://192.163.0.3/test/456 . <-(原为123的分支)当前所在目录分支到192.163.0.3/test/456
svn switch (sw):更新工作副本至不同的URL.
用法:1、switchURL [PATH]
2、switch–relocate FROM TO [PATH...]
1、更新你的工作副本,映射到一个新的URL,其行为跟“svnupdate”很像,也会将
服务器上文件与本地文件合并.这是将工作副本对应到同一仓库中某个分支或者标记的
方法.
2、改写工作副本的URL元数据,以反映单纯的URL上的改变.当仓库的根URL变动
(比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用
这个命令更新工作副本与仓库的对应关系.
18、解决冲突, 移除工作副本的目录或文件的“冲突”状态.
命令:svn resolved
svn resolved [本地目录全路径]
例子:
$ svn update
C foo.c
Updated to revision 31.
如果你在更新时得到冲突,你的工作拷贝会产生三个新的文件:
$ ls
foo.c
foo.c.mine
foo.c.r30
foo.c.r31
当你解决了foo.c的冲突,并且准备提交,运行svnresolved让你的工作拷贝知道你已经完成了所有事情。
你可以仅仅删除冲突的文件并且提交,但是svnresolved除了删除冲突文件,还修正了一些记录在工作拷贝管理区域的记录数据,所以我们推荐你使用这个命令。
注意:本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的
相关文件,然后让PATH 可以再次提交.
19、不checkout而查看输出特定文件或URL的内容
命令:svn cat
svn cat http://文件全路径
svn cat目标[@版本]…如果指定了版本,将从指定的版本开始查找.
svn cat -r PREVfilename > filename (PREV 是上一版本
例子:
svn cathttp://192.168.0.3/test/readme.txt