您的位置:首页 > 其它

搭建使用SVN的快速教程

2013-06-14 16:52 363 查看

搭建使用SVN的快速教程,能够帮助熟悉Subversion的基本配置和操作

首先需要正确安装Subversion客户端程序svn以及管理工具svnadmin。假定你使用 Subversion 1.2 或更新版本(可以运行 svn --version来检查)。
Subversion的所有版本化数据都储存在中心版本库中,因此我们需要先创建一个版本库:

$ svnadmin create /var/svn/repos
$ ls /var/svn/repos
conf/ dav/ db/ format hooks/ locks/ README.txt
这个命令创建了一个新目录 /var/svn/repos,并在其中创建了一个Subversion版本库。这个目录里主要保存了数据库文件(还有其它一些配置文件)。如果你察看它,不会找到你的版本化文件。
在Subversion中没有“项目”的概念。Subversion的版本库只是一个虚拟的版本化文件系统,可以存放你想要存放的任何文件。有些管理员喜欢为每个项目建立一个独立的版本库,而另外一些管理员则喜欢将多个项目存放到同一个版本库的不同目录里。这两种方式各有各的优点,不论是哪种方式,版本库都只是负责管理文件和目录,而“项目”则是人为指定的概念。因此,尽管书中遍布着项目这个词,但是请记住我们只不过是在谈论版本库中的某些特定目录(或者是一组目录)。

在这个例子中,我们假定已经有一些需要导入到 Subversion 版本库的条目(一组文件和目录)。接下来,我们需要把这些条目整理到一个名为myproject的目录(或者其它任意目录)里。在这个目录下,创建三个顶级子目录:branches, tags 和 trunk。将所有需版本化的数据保存到 trunk 目录下,同时保持 branches 和 tags 目录为空:

/tmp/myproject/branches/
/tmp/myproject/tags/
/tmp/myproject/trunk/
foo.c
bar.c
Makefile
branches, tags 和 trunk 这三个子目录不是 Subversion 必须的。但这样做是 Subversion 的习惯用法,所以还是遵守这个约定吧。 准备好了数据之后,就可以使用svn import命令(“导入数据到你的版本库”)将其导入到版本库中:

$ svn import /tmp/myproject file:///var/svn/repos/myproject -m "initial import"
Adding /tmp/myproject/branches
Adding /tmp/myproject/tags
Adding /tmp/myproject/trunk
Adding /tmp/myproject/trunk/foo.c
Adding /tmp/myproject/trunk/bar.c
Adding /tmp/myproject/trunk/Makefile

Committed revision 1.
$
现在版本库中已经保存了目录中的数据。如前所述,直接查看版本库是看不到文件和目录的,它们存放在数据库之中。但是版本库的虚拟文件系统中则包含了一个名为 myproject 的顶级目录,其中保存了所有的数据。
注意我们在一开始创建的那个 /tmp/myproject 目录并没有改变,Subversion 并不在意它(事实上完全可以删除这个目录)。要开始使用版本库数据,我们还要创建一个新的用于存储数据的“工作副本”,这是一个私有工作区。从 Subversion 版本库里“检出” myproject/trunk 工作副本的操作如下:

$ svn checkout file:///var/svn/repos/myproject/trunk myproject
A myproject/foo.c
A myproject/bar.c
A myproject/Makefile

Checked out revision 1.
现在,myproject 目录下有一个版本库数据的个人副本。我们可以在这个工作副本中编辑文件,并将修改提交到版本库中。 进入工作副本目录,编辑某个文件的内容。
运行 svn diff,以标准差异格式查看你的修改。
运行 svn commit,将你的修改提交到版本库中。
运行 svn update,让你的工作副本更新到版本库的“最新”版本。
启动有多中方式:
svnserve -d -r /home/neo/svn/server/repos/  ( 或者 svnserve -i)
//其中-d参数让svnserve运行在后台,-r参数限定了repo在网络上可以访问的地址
//这样如果网络上其它的计算机要checkout这个服务器,只需要输入svn checkout

svn://192.168.1.188/helloworld
//而repo在本机上实际的位置是/home/neo/svn/server/repos/helloworld。

查看是否启动可以:
netstat -a | grep svn
ps -A | grep svn

## svnadmin create ##
说明:svnadmin是服务器端命令,svnadmin create是其中一个子命令。
     创建一个工作副本,因为svnadmin直接访问版本库(因此只可以在存放版本库的机器上使用)

,它通过路径访问版本库,而不是URL。
     将创建一个新的存储库的基本目录,而不会创建中间目录
$ svnadmin create /svn/repos/

## svn import ##
说明:是将未版本化文件导入版本库的最快方法,会根据需要创建中介目录
     svn import不需要一个工作副本,你的文件会直接提交到版本库,
     这通常用在你希望将一组文件加入到Subversion 版本库时
$ svn import /svn/source/ file:///svn/repos/project1 -m "Initial import"   

## svn list ##
说明:查看版本库目录内容
$ svn list file:///svn/repos/project1

## svn update ##
说明:让你的工作副本与最新的版本同步,这将结合你和所有其他人在上次更新之后的改变到工作

副本
$ svn update

## svn checkout ##
说明:检出,得到一个项目的私有拷贝(工作副本)
$ svn checkout http://svn.example.com/repos/calc
$ svn checkout file:/var/svn/repos
$ svn checkout file:localhost/var/svn/repos
$ svn checkout svn:192.168.10.183/repos
     获得旧的版本库快照,您可以使用svn update和svn checkout--revision (-r) 选项来把整

个工作副本“时光倒流”
     检查出一个新的工作在r1729副本    
$ svn checkout -r 1729
     更新现有的工作副本,r1729   
$ svn update -r 1729
     把你的工作副本放到 subv,而不是和前面那样放到 trunk,如果 subv 不存在,将会自动创


$ svn checkout http://svn.collab.net/repos/svn/trunk subv

## svn add ##
说明:如果 foo 是目录,所有 foo 中的内容也会调度增加。如果你只想添加 foo
     本身,请使用 --non-recursive (-N) 参数。
     将文件, 目录或者符号链接 foo 添加到版本库。
$ svn add foo

## svn delete ##
说明:将文件, 目录或者符号链接 foo 从版本库中删除,如果 foo 是文件或符号链接,它会马上
     从工作副本中删除。如果 foo 是目录,不会被删除,但是 Subversion 调度删除它。当你提

交修
     改后,foo 就会在你的工作副本和版本库中被删除
$ svn delete foo

## svn copy ##
说明:建立一个新条目 bar 作为 foo 的复制品,并且自动调度增加 bar,当在下次提交时会将

bar
     添加到版本库,这种复制会记录下来历史(按照来自 foo 的方式记录)。如果不传递 --

parents,
     svn copy 并不建立中介目录。
$ svn copy foo bar

## svn move ##
说明:你必须告诉 Subversion 你做的其他任何事.例如,你希望拷贝或移动工作副本的一个
     文件,你应该使用 svn copy 或者 svn move,而不要使用操作系统的拷贝移动命令
     这个命令与与运行 svn copy foo bar; svn delete foo 完全相同,bar 作为 foo 的拷
     贝调度添加,foo 已经调度删除。如果不传递 --parents,svn move 不建立中介的目录。
$ svn move foo bar

## svn diff ##
说明:检查修改的详细信息。你可以在没有网络的情况下使用 svn status, svn diff 和 svn

revert.
     Subversion 通过在 .svn 管理区域使用原始的版本缓存来做到这一点。
     另一种检查修改的方式是 svn diff 命令。你可以通过不带参数的 svn diff 精确的找出你

所做的
     修改,它会输出统一差异格式的修改信息:
$ svn diff
     svn diff 命令通过比较你的文件与存储在 .svn 的“原始”文件来输出信息,预定要增加的

文件会显
     示所有增加的文本,预定要删除的文件会显示所有要删除的文本。
     输出的格式为统一差异格式。删除的行前面加一个 -,增加的行前面有一个 +。svn diff 命

令也打
     印文件名和补丁程序需要的位置信息,所以你可以通过重定向一个差异文件来生成“补丁”


$ svn diff > patchfile
     如果你期望不同的输出格式,你可以使用
     --diff-cmd 指定外置的比较程序,并且通过选项 --extensions(-x) 来传递其它参数。例如


     察看本地文件 foo.c 的本地修改,同时忽略大小写差异,你可以运行
$ svn diff --diff-cmd /usr/bin/diff -x "-i" foo.c。
     如果传递一个 --revision (-r) 参数,你的工作副本会与版本库中的指定版本比较:
$ svn diff -r 3 rules.txt
     如果通过 --revision (-r) 传递两个通过冒号分开的版本号,这两个版本会直接比较
$ svn diff -r 2:3 rules.txt
     最后,即使你在本机没有工作副本,还是可以比较版本库的修订版本,只需要在命令行中输

入合适的URL:
$ svn diff -c 5 http://svn.example.com/repos/example/trunk/text/rules.txt

## svn revert ##
说明:取消本地修改,使用缓存在 .svn 目录的“原始”副本来把文件恢复到未修改的状态。此外,

svn
     revert 可以撤销任何预定要做的操作—例如你不再想增加一个新文件
$ svn revert README

## svn status ##
### svn status --verbose ##
说明:会给你所有的修改信息—而不
     需要访问版本库,并且不会在不知情的情况下与其它用户作的修改合并.

     如果你在工作副本的顶级目录运行不带参数的 svn status 命令,它会检测你对所有文件或

目录作
     出的修改
$ svn status
     如果你传递一个路径给svn status,它只给你这个项目的信息:
$ svn status stuff/fish.c
     svn status也有一个--verbose(-v)选项,它可以显示工作副本中的所有项目,即使没有改变

过的
$ svn status -v
     上面所有的 svn status调用并没有联系版本库—只是与 .svn 中的原始数据进行比较。最后

,使用
     --show-updates(-u) 选项,它将会联系版本库,为已经过时的数据增加新信息:
$ svn status -u -v

## svn resolved ##
### svn resolved mk-bcc.bat ##
说明:删除因冲突产生的三个临时文件和接受版本的文件,在您指定使用--accept选项,并且

Subversion不再考虑文件在一个冲突的状态
$ svn resolve --accept working sandwich.txt
     丢弃你的修改而接收新获取的修订版本
$ svn resolve --accept theirs-full sandwich.txt

## svn commit ##
说明:提交(原子性操作)将你的修改提交到版本库
$ svn commit button.c -m "Fixed a typo in button.c." 
     然而,如果你把写日志信息当作工作的一部分,你也许会希望告诉Subversion通过一个文件


     得到日志信息,使用--file(-F)选项:
$ svn commit -F logmsg

## svn cleanup ##
说明:它会搜索你的工作副本和运行日志,删除任何锁在进程中的工作副本。如果Subversion 曾经

告诉你,你的工作副本的一些部分被“锁定”,
     这是命令你就应该执行,svn状态将显示一个L旁边的上锁的项
$ svn status
L somedir
M somedir/foo.c
$ svn cleanup
$ svn status
M somedir/foo.c

## svn log ##
说明:检查日志历史
$ svn log -r 5:19 # shows logs 5 through 19 in chronological order
$ svn log -r 19:5 # shows logs 5 through 19 in reverse order
$ svn log -r 8 # shows log for revision 8
     你也可以检查日志历史的一个文件或目录。例如
$ svn log foo.c
$ svn log http://foo.com/svn/trunk/code/foo.c

## svn cat ##
说明:输出特定文件或URL的内容,如果你只是希望检查一个过去的版本而不希望察看它们的区别,

使用svn cat
$ svn cat -r 2 rules.txt
     你可以重定向输出到一个文件:
$ svn cat -r 2 rules.txt > rules.txt.v2

## svn list ##
说明:svn list可以在不下载文件到本地目录的情况下来察看目录中的文件:
$ svn list http://svn.collab.net/repos/svn
    如果你希望察看详细信息,你可以使用--verbose(-v) 参数:
$ svn list -v http://svn.collab.net/repos/svn

## svn switch ##
说明:把工作副本更新到别的URL,别名sw。
     如果你目前所在目录vendors分支到vendors-with-fix,你希望转移到那个分支:
$ svn switch http://svn.red-bean.com/repos/branches/vendors-with-fix .
     切换回来,只需提供了一个你原来检出工作副本的URL:
$ svn switch http://svn.red-bean.com/repos/trunk/vendors .

### working copy 的四种状态 ###
(1) 未修改且是当前的
文件在工作目录里没有修改,在工作版本之后没有修改提交到版本库。svn commit 操作不做
任何事情,svn update 不做任何事情。

(2) 本地已修改且是当前的
在工作目录已经修改,从基本修订版本之后没有修改提交到版本库。本地修改没有提交,因此
svn commit 会成功提交,svn update 不做任何事情。

(3) 本地未修改,已过时
这个文件在工作目录没有修改,但在版本库中已经修改了。这个文件最终将更新到最新版本,
成为当时的公共修订版本。svn commit 不做任何事情,svn update 将会取得最新的版本到工
作副本。

(4) 本地已修改,已过时
这个文件在工作目录和版本库都得到修改。一个 svn commit 将会失败,这个文件必须首先更
新,svn update 命令会合并公共和本地修改,如果 Subversion 不可以自动完成,将会让用户解
决冲突。

### 目录 .svn 中有什么 ###
工作副本中的任何一个目录包括一个名为 .svn 管理区域。通常列表操作不显示这个目录,但
它仍然是一个非常重要的目录。无论你做什么,不要删除或是更改这个管理区域的任何东西,
Subversion 使用它来管理工作副本。
如果你不小心删除了子目录 .svn,最简单的解决办法是删除包含的目录(普通的文件系统删
除,而不是 svn delete),然后在父目录运行 svn update,Subversion 客户端会重新下载你删
除的目录,并包含新的 .svn。

## 典型的工作周期是这样的:##
1. 更新你的工作副本。
   svn update
2. 做出修改
   svn add
   svn delete
   svn copy
   svn move
3. 检验修改
   svn status
   svn diff
4. 可能会取消一些修改
   svn revert
5. 解决冲突(合并别人的修改)
   svn update
   svn resolve
6. 提交你的修改
   svn commit

## 下面是一些修订版本关键字的例子:##
$ svn diff -r PREV:COMMITTED foo.c
# shows the last change committed to foo.c
$ svn log -r HEAD
# shows log message for the latest repository commit
$ svn diff -r HEAD
# compares your working copy (with all of its local changes) to the
# latest version of that tree in the repository
$ svn diff -r BASE:HEAD foo.c
# compares the unmodified version of foo.c with the latest version of
# foo.c in the repository
$ svn log -r BASE:HEAD
# shows all commit logs for the current versioned directory since you
# last updated
$ svn update -r PREV foo.c
# rewinds the last change on foo.c, decreasing foo.c's working revision
$ svn diff -r BASE:14 foo.c
# compares the unmodified version of foo.c with the way foo.c looked in revision 14

## 当你指定一个日期,Subversion会在版本库找到接近这个日期的最近版本,并且对这个版本继

续操作:##
$ svn log -r {2006-11-28}
$ svn checkout -r {2006-02-17}
$ svn checkout -r {15:30}
$ svn checkout -r {15:30:00.200000}
$ svn checkout -r {"2006-02-17 15:30"}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: