现在的位置: 首页 > 综合 > 正文

SVN版本管理笔记(Linux)

2013年10月12日 ⁄ 综合 ⁄ 共 5784字 ⁄ 字号 评论关闭

一、       




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
时的路径设置。

 

抱歉!评论已关闭.