SVN使用教程

来源:互联网 发布:知乎 win10 杀毒软件 编辑:程序博客网 时间:2024/06/01 07:20

SVN的基本工作原理: 在一台服务器上建立一个源代码库,库里可以存放许多不同项目的源程序。由源代码库管理员统一管理这些源程序。每个用户在使用源代码库之前,首先要把源代码库里的项目文件下载到本地,然后开发人员可以在本地修改,然后用SVN命令进行提交,由源代码库统一管理修改。
SVN的服务器版本subversion,并且配置好环境。我的机器上只安装SVN的客户端TortoiseSVN.

subversion目录说明:*dav目录:是提供apache与mod_dav_svn使用的目录,让他们存储内部数据*db目录:就是所有版本控制的数据存放文件*hooks目录:放置hook脚本文件的目录*locks目录:用来放置subversion见艰苦锁定数据的目录,用来追踪存取文件库的客户端*format文件:是一个文本文件,里面只放了一个整数。表示当前文件库配置的版本号*conf目录:是这个仓库的配置文件(仓库的用户访问账号、权限等)

1,新建一个目录用于存储SVN所有文件
mkdir /home/svn
2,新建一个版本仓库
svnadmin create /home/svn/project

在commit的时候,如果有人已经修改并提交了,SVN会报告因发生冲突而commit失败,此时需要手动解决冲突,然后才能再次提交。一般来说是这样:在每次开始动手修改前,先进行update,在修改完成后直接进行commit。这样的话可以最大程度避免冲突的发生。

常用命令:
svn checkout -从版本库取出一个工作拷贝
svn commit -将改动的文件提交到版本库
svn update -更新你的工作拷贝
svn add-向版本库中添加新文件
svn delete-从版本库中删除文件
svn revert-取消所有的本地编辑

Subversion还有目录规范,创建三个顶级目录:
/trunk 存放开发的“主线”
/branches 存放支线副本
/tags 存放标签副本

Subversion 提供了主线、分支管理技术,使得在软件开发中可以更方便、灵活的对项目的进度、版本的发布、版本的维护、软件功能的拓展与定制进行管理。
主线(trunk):一个项目建立时就存在,并伴随着项目的成长而不断的成长,直到项目完全结束。
分支(branch):一般是指功能分支,例如:我们的某个项目要添加一个模块,但这个模块又比较复杂,实现难度比较大。为了不影响主线的稳定,我们就可以创建一个功能分支来专门开发这个模块,当这个模块开发完成以后,并通过测试部门的各项测试,再合并到主线中去。再比如,我们的交警 GPS 项目已经开发完成了,但是这个项目是给泉州交警做的,现在我们又接到了一个交警项目,不过是要给厦门交警大队的。现在厦门交警大队要求我们给他们定制一些功能。我们又不想再主线上进行修改,这个时候,我们也可以创建一个分支,并在这个分支上开发,这时是不会对主线造成影响的。等给厦门开发完成了以后,我们发现,他们要求的有些功能其实很好,以后别的地方可能也需要同样的功能。这个时候我们就可以根据我们的需要,将有用的模块有选择的合并到主线中来。
标签(tag):标签和分支一样,也是一个目录,不过这个目录中一般存放的是发布的信息(当然我们也可以只用分支,但是用标签更清楚明了一些)。还是拿我们的交警项目来举个例子:我们的交警项目开发完成了以后,要拿给泉州交警大队用了,也就是要发布(release),假设这个版本叫做1.0.2。这个时候,我们就要创建一个标签,当泉州交警大队用了三个月,发现了一个 BUG,我们只需要签出这个标签中的代码(它和我们刚提供给泉州交警大队时候的是一模一样的),进行调试,并修正这个 BUG。然后再发布一个版本,假设叫做1.1.0,这个时候我们就在创建一个 1.1.0的标签……
要注意,标签目录里面的代码,要进行严格的控制,除了修正 BUG 外,不能做任何其他的事情。

1、将文件checkout到本地目录(从服务器拉代码)

svn checkout path(path是服务器上的目录)例如:svn checkout svn://192.168.1.10/a2简写:svn co svn://192.168.1.10/a2

2、往版本库中添加新的文件

svn add file例如:svn add test.java(添加test.java)svn add *.java(添加当前目录下所有的java文件)

3、将改动的文件提交到版本库,[]表示可选参数

svn commit -m "LogMessage" [-N] [--no-unlock] PATH(如果选择了保持锁,就使用--no-unlock开关)例如:svn commit -m "add test file for my test" test.php简写:svn ci

4、加锁/解锁

svn lock -m "LockMessage" [--force] PATH例如:svn lock -m "lock test file" test.phpsvn unlock PATH

5、更新到某个版本

svn update -r m path例如:     svn update如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。     svn update -r 200 test.php(将版本库中的文件test.php还原到版本200)     svn update test.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,修改文件,然后清除svn resolved,最后再提交commit)简写:svn up

6、查看文件或者目录状态

svn status path简写:svn st

7、删除文件

svn delete path -m "delete test fle"例如:svn delete svn://192.168.1.1/pro/domain/test.php -m "delete test file"或者直接svn delete test.php 然后再svn ci -m 'delete test file',推荐使用这种;简写:svn (del, remove, rm)

8、查看日志

svn log path例如:svn log test.php 显示这个文件的所有修改记录,及其版本号的变化

9、查看文件详细信息

svn info path例如:svn info test.php

10、比较差异

svn diff path(将修改的文件与基础版本比较)   例如:svn diff test.phpsvn diff -r m:n path(对版本m和版本n比较差异)   例如:svn diff -r 200:201 test.php   简写:svn di

11、将两个版本之间的差异合并到当前文件

svn merge -r m:n path例如:svn merge -r 200:205 test.php(将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下)

12、SVN 帮助

svn helpsvn help ci

创建分支

建立分支非常的简单—使用svn copy命令给你的工程做个拷贝,Subversion不仅可以拷贝单个文件,也可以拷贝整个目录,在目前情况下,你希望作/calc/trunk的拷贝,新的拷贝应该在哪里?在你希望的任何地方—它只是在于项目的政策,我们假设你们项目的政策是在/calc/branches建立分支,并且你希望把你的分支叫做my-calc-branch,你希望建立一个新的目录/calc/branches/my-calc-branch,作为/calc/trunk的拷贝开始它的生命周期。

有两个方法作拷贝,我们首先介绍一个混乱的方法,只是让概念更清楚,作为开始,取出一个工程的根目录,/calc:

$ svn checkout http://svn.example.com/repos/calc bigwcA  bigwc/trunk/A  bigwc/trunk/MakefileA  bigwc/trunk/integer.cA  bigwc/trunk/button.cA  bigwc/branches/Checked out revision 340.

建立一个备份只是传递两个目录参数到svn copy命令:

$ cd bigwc$ svn copy trunk branches/my-calc-branch$ svn statusA  +   branches/my-calc-branch

在这个情况下,svn copy命令迭代的将trunk工作目录拷贝到一个新的目录branhes/my-calc-branch,像你从svn status看到的,新的目录是准备添加到版本库的,但是也要注意A后面的“+”号,这表明这个准备添加的东西是一份备份,而不是新的东西。当你提交修改,Subversion会通过拷贝/calc/trunk建立/calc/branches/my-calc-branch目录,而不是通过网络传递所有数据:

$ svn commit -m "Creating a private branch of /calc/trunk."Adding         branches/my-calc-branchCommitted revision 341.

现在,我们必须告诉你建立分支最简单的方法:svn copy可以直接对两个URL操作。

$ svn copy http://svn.example.com/repos/calc/trunk \           http://svn.example.com/repos/calc/branches/my-calc-branch \      -m "Creating a private branch of /calc/trunk."Committed revision 341.

其实这两种方法没有什么区别,两个过程都在版本341建立了一个新目录作为/calc/trunk的一个备份,这些可以在图 4.3 “拷贝后的版本库”看到,注意第二种方法,只是执行了一个立即提交。 [7]这是一个简单的过程,因为你不需要取出版本库一个庞大的镜像,事实上,这个技术不需要你有工作拷贝。

SVN中的一些概念 :
(1). repository(源代码库)
源代码统一存放的地方
(2). Checkout (提取)
当你手上没有源代码的时候,你需要从repository checkout一份
(3). Commit (提交)
当你已经修改了代码,你就需要Commit到repository
(4). Update (更新)
当你已经Checkout了一份源代码, Update一下你就可以和Repository上的源代码同步,你手上的代码就会有最新的变更

0 0