一、
SVN
服务器环境的搭建
我们开发的项目属于基于
ARM9
核
linux
系统的嵌入式管理软件,整个开发编译环境必须是在
linux
下面。因此,
SVN
服务器的环境也必须是在
linux
系统。
现有的服务器环境:操作系统:
Redhat Linux AS4U4
,内核版本为:
2.6.13
。
1.
开始安装前,通过收集各种资料,确定下安装最新的
SVN
版本,并且通过
Apache
作为网络服务器。
准备软件安装包:
Apr :
apr-1.2.12
和
apr-util-1.2.12
Apache : httpd-2.2.11.tar.gz
Subversion: subversion-1.6.1.tar.gz
和
subversion-deps-1.6.1.tar.gz
安装时出现问题:公司服务器
linux
系统安装
gcc
或其他任何编译器。
解决方法:最直接就是安装
gcc
编译器,但是考虑到通过源码安装的复杂性,决定通过
linux
系统盘修复安装。公司的这台服务器配置比较低,自带光驱以损坏,通过
usb
转接光驱启动,但是安装过程中光盘退出好有问题,通过更换光驱,强制取出光盘等方法,都不能实现修复安装。
注:安装所用服务器主要是用来作为我们部门的
ftp
服务器,用以存放及管理部门各类文档所用,因此没有装任何的编译器,并且服务器已有大量重要文档,不能重装系统。
结果:安装失败。
2.
第二次成功安装
考虑到现有服务器配置的限制,在能够实现我们代码管理的目的基础上,最后选择通过
SVN RPM
包的方式安装独立服务器。
准备软件安装包:
mod_dav_svn-1.4.2-1.i386.rpm
安装命令格式:
#rpm -i ( or --install) options mod_dav_svn-1.4.2-1.i386.rpm
3.
配置建立
svn
版本库目录
建立
svn
版本库命令:
#cd /home
#mkdir svn
#svnadmin create svn/tc3600
修改
svn
版本库配置文件:
svnserve.conf
#vi /home/svn/tc3600/conf/svnserve.conf
内容修改为
:
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
realm = tc3600
配置允许访问的
svn
用户
:passwd
vi /home/svn/tc3600/conf/passwd
[users]
name= password
hulei = 123
权限配置文件
:
authz
用户组格式:
[groups]
<
用户组名
> =
<
用户
1>,<
用户
2>
版本库目录格式:
[<
版本库
>:/
项目
/
目录
]
@<
用户组名
> =
<
权限
>
<
用户名
> = <
权限
>
/,
表示根目录及以下。根目录是
svnserve
启动时指定的,我们指定为
/home/svn
。
/
就是表示对全部版本库设置权限。
tc36001:/,
表示对版本库
1
设置权限
tc36002:/abc,
表示对版本库
2
中的
abc
项目设置权限
tc36002:/abc/aaa,
表示对版本库
2
中的
abc
项目的
aaa
目录设置权限
权限主体可以是用户组、用户或
*
,用户组在前面加
@
,
*
表示全部用户。权限可以是
w
、
r
、
wr
和空,空表示没有任何权限。
示例:
[groups]
admin = alan
[/]
@admin = rw
[repos1:/abc/aaa]
king = rw
[repos2:/pass]
king =
注意:对用户配置文件的修改立即生效,不必重启
svn
。
4
启动
svnserve
#svnserve -d –r
svn://10.0.20.225/home/svn/tc3600
,这样启动的时候,输入路径
svn://10.0.20.225
co
时得到的是
home
下的所有内容,因此可以指定
SVN
服务的起始目录:
svnserve –d --root=/tc3600
查看此进程是否启动:
#ps –ef|grep svnserve
二、
SVN
命令
2.1.
版本库建立之后,将已有的项目资料导入到版本库中。
使用命令:
import
首先在本地创建好目录结构:
#mkdir -p
code/{branches,tags,trunk}
按照
svn
手册上的建议,我们版本库的布局采用
branches/tags/trunk
这样的三个目录。然后可以将代码直接拷贝的
trunk
目录。
#svn import code svn://10.0.20.225 –m”message of this
action”
将我们构造好的版本库布局(以及代码,
已经拷贝到
trunk
下)提交到版本库。
查看目录结构
#svn
list –verbose
svn://10.0.20.225
注意:
a.
Import
时,只是导入
code
下的所有内容,不包含此目录本身。
b.
-m
与
- -message
相同。
c. --no-ignore
选项。这个选项的功能就是执行相应动作的时候,不忽略任何文件。那么执行以下两条命令:
svn import [source] [repository]
--no-ignore
或
svn add [source] --no-ignore
会自动将
source
目录下所有的内容全部
import
或者
add
。
执行
import
时,在
lib
这个文件目录时出现错误:
SVN
:有效
UTF-8
数据(
16
进制)后面是无效
UTF
—
8
序列。问题。根据掌握资料,可以判断是中文字符或是文件内连接符的原因,可能跟系统有关,没有找的解决办法。所以只是
import
源程序中项目组需要经常改动的核心部分
development
。其他的编译环境我打算打包后放入主目录
trunk
中,建立一个开发平台
platform
目录,用以存放编译环境代码,这样编译时,只需要替换掉
development
这个目录就可以了。如果打包后的文件依然存在上传问题,则只能需要各个同事自己在本地备份编译环境。
2.2.
日常管理常用命令
2.2.1
、将文件
checkou
t
到本地目录
svn checkout path
(
path
是服务器上的目录)
例如:
svn checkout svn://10.0.20.225
简写:
svn co
2.2.2
、往版本库中添加新的文件
svn add file
例如:
先
chectout
到本地,然后
add
新文件
svn add
test.php
(
添加
test.php)
svn add *.php
(
添加当前目录下所有的
php
文件
)
然后将改动的文件提交到版本库
svn commit -m “LogMessage“ [-N]
[--no-unlock] PATH
(
如果选择了保持锁,就使用
–no-unlock
开关
)
例如:
svn commit -m “add test file for my test“ test.php
简写:
svn ci
2.2.3
、加锁
/
解锁
svn lock -m “LockMessage“
[--force] PATH
例如:
svn lock -m “lock test file“ test.php
svn unlock PATH
2.2.4
、更新到某个版本
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
2.2.5
、查看文件或者目录状态
1
)
svn status path
(目录下的文件和子目录的状态,正常状态不显示)
【
?
:不在
svn
的控制中;
M
:内容被修改;
C
:发生冲突;
A
:预定加入到版本库;
K
:被锁定】
2
)
svn status -v
path(
显示文件和子目录状态
)
第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。
注:
svn status
、
svn diff
和
svn revert
这三条命令在没有网络的情况下也可以执行的,原因是
svn
在本地的
.svn
中保留了本地版本的原始拷贝。
简写:
svn st
2.2.6
、删除文件
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)
2.2.7
、查看日志
svn log path
例如:
svn log
test.php
显示这个文件的所有修改记录,及其版本号的变化
2.2.8
、查看文件详细信息
svn info path
例如:
svn info
test.php
2.2.9
、比较差异
svn diff path(
将修改的文件与基础版本比较
)
例如:
svn diff
test.php
svn diff -r m:n path(
对版本
m
和版本
n
比较差异
)
例如:
svn diff -r
200:201 test.php
简写:
svn di
2.2.10
、将两个版本之间的差异合并到当前文件
svn merge -r m:n path
例如:
svn merge
-r 200:205 test.php
(将版本
200
与
205
之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下)
2.2.11
、
SVN
帮助
svn help
svn help ci
2.2.12
、版本库下的文件和目录列表
svn list path
显示
path
目录下的所有属于版本库的文件和目录
简写:
svn ls
2.2.13
、创建纳入版本控制下的新目录
svn mkdir:
创建纳入版本控制下的新目录。
用法
: 1
、
mkdir PATH…
2
、
mkdir URL…
创建版本控制的目录。
1
、每一个以工作副本
PATH
指定的目录,都会创建在本地端,并且加入新增
调度,以待下一次的提交。
2
、每个以
URL
指定的目录,都会透过立即提交于仓库中创建。
在这两个情况下,所有的中间目录都必须事先存在。
2.2.14
、恢复本地修改
svn revert:
恢复原始未改变的工作副本文件
(
恢复大部份的本地修改
)
。
revert:
用法
: revert
PATH…
注意
:
本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复
被删除的目录
2.2.15
、代码库
URL
变更
svn switch (sw):
更新工作副本至不同的
URL
。
用法
:
1
、
switch URL [PATH]
2
、
switch
–relocate FROM TO [PATH...]
1
、更新你的工作副本,映射到一个新的
URL
,其行为跟
“svn
update”
很像,也会将
服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的
方法。
2
、改写工作副本的
URL
元数据,以反映单纯的
URL
上的改变。当仓库的根
URL
变动
(
比如方案名或是主机名称变动
)
,但是工作副本仍旧对映到同一仓库的同一目录时使用
这个命令更新工作副本与仓库的对应关系。
2.2.16
、解决冲突
svn resolved:
移除工作副本的目录或文件的
“
冲突
”
状态。
用法
: resolved
PATH…
注意
:
本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的
相关文件,然后让
PATH
可以再次提交。
2.2.17
、输出指定文件或
URL
的内容。
svn cat
目标
[@
版本
]…
如果指定了版本,将从指定的版本开始查找。
svn cat -r PREV filename > filename (PREV
是上一版本
,
也可以写具体版本号
,
这样输出结果是可以提交的
)
三、容易出现的问题
在访问
svnserve
时,遇到了不少的问题,大致总结一下:
1.
一定要记得启动
svnserve
。
2.
记得要正确的修改配置文件
svnserve.conf
和
passwd
。原始文件都是被
#
注释的,没有作用,配置时去掉相应语句前面的
#
。
3.
保证版本库服务器没有配置限制远程访问
svnserve
的规则。有时在访问
svn
服务器的时候,会提示服务器积极拒绝链接。简单起见,可以看看
iptables -L INPUT
和
iptables -L OUTPUT
有没有限制访问的规则。
4.
要保证输入版本库的
URL
正确。
5.
Import
时,只是导入
code
下的所有内容,不包含此目录本身。
6.
-m
与
- -message
相同。
7.
--no-ignore
选项。这个选项的功能就是执行相应动作的时候,不忽略任何文件。那么执行以下两条命令:
svn import [source] [repository]
--no-ignore
或
svn add [source] --no-ignore
会自动将
source
目录下所有的内容全部
import
或者
add
。
8.
导入的另外一种方法,先用
svn checkout
取出版本,然后构建目录和源码,执行
svn add
并且
svn commit
即可。
9.
让
Linux
启动时自动启动
svn
服务的办法是在
/etc/rc.local
文件里添加下面的语句:
/opt/svn/bin/svnserve -d
其中:
/opt/svn/bin
是
svn
的安装路径。
问题
1
:
2009 /06 /25
在使用过程中,发现一个问题,描述如下:
通过客户端或者命令行
co
时,输入
svn
服务的根目录既
svn://10.0.20.225
,会把版本库的父目录也
co
下来,在重复配置了
conf
文件下的
authz
子文件后,只是改变了对文件访问的权限,不能改变访问路径。
解决办法:重新创建版本库,
#cd home
# mkdir svn
#svnadmin svn/tc3600
这样创建的版本库在通过
svn://10.0.20.225
访问时,机会直接
co
下
tc3600
版本库中的目录。
后记:在
06.25
下午的使用中,我通过
import
命令上传一个文件夹,路径为:
Svn://10.0.20.225/home/svn/tc3600,
结果在
co svn://10.0.20.225
时,将会得到整个路径名的文件结构,既
/home/svn/tc3600
。因此关于
06.25
的问题解决方法错误。错误应在
import
时的路径设置。