SVN — SVN、TortoiseSVN安装与使用说明

服务器安装

你可以到下面这个地址下载最新的二进制压缩版本svn-win32-1.5.6.zip,地址是: http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91 把该文件解压到一个目录即可,假定为 E:\svntest\svn-win32-1.5.6。

客户端安装

客户端工具有很多,这里我们先用TortoiseSVN,到后面开发时再学学subclipse插件。下载地址

http://tortoisesvn.net/downloads,获取最新安装包与语言包。

启动 Subversion 服务

svnserve -d -r e:\svntest\proj

其中的 -d 参数表示 svnserve.exe 将会作为一个服务程序运行在后台,而 -r 参数表示将 e:\svntest\proj目录指定为代码库的根目录,以后创建的代码库就放在这个目录下,所以只需启一个服务即可,只要把这些库放在同一目录下,然后启动根目录。

用上述命令行方式启动的 svn 服务时命令窗口要一直开着,不能关闭它。以后我们可以将 svnserve 安装成 windows 的一个服务,这样就不用怕出现意外人为的关掉了,后面会讲怎样安装windows服务。

创建代码库

在服务器端的 E:\svntest\proj 目录下,建立一个名为 proj1 的代码库:

svnadmin create --fs-type fsfs e:\svntest\proj\proj1

配置SVN服务文件

编辑proj1\conf\svnserve.conf文件:

扫描二维码关注公众号,回复: 1208108 查看本文章

[general]
password-db = passwd
anon-access = none
auth-access = write
authz-db = authz

后面会讲这些配置项的具体意义。

配置用户密码

编辑proj1\conf\passwd配置文件:

jzj = 111111
user1 = 111111
guest = 111111

导入代码库目录结构

svn import -m "New import" e:\myproj svn://localhost/proj1

注意:如果你没有指定 --message 或 --file, 那么 Subversion 自动调用你的editor 。
前提是你设置了SVN_EDITOR或EDITOR环境变量。否则会报下面的错误:

svn: 没有一个 SVN_EDITOR,VISUAL 或 EDITOR 环境变数被设定,执行时期的设定中也没有 'editor-cmd' 选项

设置环境变量:在win环境下,可以设置SVN_EDITOR为%SystemRoot%\system32\notepad.exe

该条命令把 E:\myproj 下的子目录及文件上传到 proj1 代码库中,并保持本地目录结构,但 myproj 目录不会上传到 proj1 目录中。

另外要注意的是,上面的双引号不能改成单引号,否则报错。  

配置目录访问权限

编辑proj1\conf\authz文件:

[groups]
g_guest  = guest
g_dev = jzj,user1

##表示所有用户对根proj1只有读的权限,
##如果 * = '' 则不管子目录是否设置了权限,都将不能访问
[proj1:/]
* = r

##只有jzj才能对dir1目录进行写,其他都只能读
[proj1:/dir1]
jzj = rw
@g_guest = r
* = r

##user1与guest用户对dir2有写权限,其他用户不能访问dir2
[proj1:/dir1/dir2]
user1 = rw
@g_guest = rw
* =

##最后未设置的目录取父目录的权限,如果父没有才取爷的,没有继续往上找

正确理解配置文件

在这里首先要注意一点,任何配置文件的有效配置行,都不允许存在前置空格 ,否则程序执行命令时会出错。

svnserve.conf

下面告诉 svnserve.exe 程序用户名与密码放在 passwd 文件里。请注意,访问时要弹出登录密码框时,首先这个是一定要打开的,且 auth-access 不能设置 none,否则不会弹出密码框。

password-db = passwd

下面说明匿名用户不可以通过svn://方式访问档案库,默认(即不打开此项时)下客户可以以匿名方式通过svn://方式任意访问档案库。

anon-access = none

以下配置说明通过验证的用户可以读和写(但要求 authz-db 未打开,否则最终权限不只是受该配置影响,还会结合 authz-db 文件设置的目录权限集),这里什么是通过验证的?就是配置了 password-db ,而又未打开 authz-db 目录访问权限配置项,且登录时使用了password-db 文件配置的用户时,此时的权限就会就会以该设置为准。

auth-access = write

下面说明项目目录访问权限的相关配置是放在 authz.conf 文件里
authz-db = authz.conf

上述的 passwd.conf 和 authz.conf 两个文件也可以作为多个代码库共享使用,我们只要将它们放在公共目录下,比如说放在 E:\svntest\proj 目录下,然后在每个代码库的 svnserve.conf 文件中,使用如下语句,当然这些最好不要共用,除非代码库的目录结构与人员组织结构是一样的。

password-db = ../../passwd.conf
authz-db = ../../authz.conf

authz.conf

authz.conf 文件的配置段,可以分为两类, [group] 是一类,里面放置着所有用户分组信息。其余以形如 [proj1:/] 开头的是另外一类,每一段就是对应着项目的一个目录,其目录相关权限,就在此段内设置。

[proj1:/] 表示 proj1 项目的根目录。其中的 proj1 就是代码库的名称,即前面用 svnadmin create 命令创建出来的 proj1,如果去掉前面的 proj1: 部分,[/第一级子目录]则表示所有代码库通适用。

@ 表示接下来的是一个组名,不是用户名。

* 表示前面未被设置权限的人。

注:只能配置到目录级别,不能针对每个文件进行权限分配。

权限关系小结

  • 如果 auth-access = none 时,不管是否打开了 password-db 匹配,都不会弹出密码框,会尝试以匿名方式访问。
  • 如果 auth-access = none 时,只能以匿名方式访问,如果时此时 anon-access 也为 none ,任何人都不能访问库了。
  • 如果未打 password-db 项时,不管是否 auth-access 设置成 read ,还是 write,都将尝试以匿名方式访问。 
  • 如果 anon-access  设置成 read 或 write  或者未打开时, anon-access  又设置成 read 或 write是,访问时会优先以匿名方式访问,而不会弹出密码框(注:我是这里的讲的访问时是指使用如下方式访问  ,但如果你修改了本地资源提交到库中时,且 anon-access  不会 write 时,它还是会让你输入用户名与密码的。)
  • 如果 anon-access  设置成 write  时,提交本地资源时不会弹出密码框,它会直接以匿名方式提交。
  • svnserve.conf配置文件中的 auth-access 、anon-access  与 authz-db 设置是相关联的,它们是是相互依赖的,要看是否有权限,会取两都间最大限制为准备,比如说 anon-access  = write ,而 authz-db 配置文件中的匿名设置成了 r ,最后匿名权限就是 read 。svnserve.conf配置的是总体(所有目录)的权限,而 authz-db 配置的是各个目录中的访问权限。

 Subversion的有用配置

1,使用“锁定-编辑-解锁”模型

Subversion使用与CVS相似的工作模型,也就是“拷贝-修改-合并”,但是有时候还是很有必要使用“锁定-编辑-解锁”模型,例如对于二进制文件,或者其他不太适合合并的文件。
实现这种模式是通过设置文件属性然后再锁定文件来操作的。属性是附加到版本控制下的文件之上的属性,就像最后的修改日期是一个文件的属性一样,你可以为Subversion控制之下的文件和目录设置自定义的属性。
在Subversion 里是通过内置的属性“svn:needs-lock”实现“锁定-编辑-解锁”模型的,例如我们有一个word文件“介绍.doc”,大家很清楚Word 文件是二进制格式,不可能使用“拷贝-修改-合并”模型,所以我们要使用“锁定-编辑-解锁”模型。你可以将它设置属性“svn:needs-lock”,然后提交,之后其他人在更新这个文件的时候,就会得到一个只读的文件,他们想修改这个文件必须首先获得锁,获得锁的过程会将文件置为可写,而其他人此时如果想得到锁就会发现做不到,只有得到锁的人放弃锁定,别人才能得到锁,继续工作。下面分别讲述了如何使用svn命令行和TortoiseSVN设置锁和使用锁。

1) 第一步,设定“svn:needs-lock”属性

使用命令行锁定“介绍.doc”:
svn propset svn:needs-lock 'x' 介绍.doc

运行这个命令后,“介绍.doc”就已经是设置了“svn:needs-lock ”,但为了使之生效还要运行“svn commit”,之后其他用户update的时候就会发现这个文件已经是只读的了。需要注意的是我们设置的属性值是“x”,实际上任意值都可以, Subversion会忽略其内容。
使用TortoiseSVN设定属性也很简单:
“介绍.doc”右键选中- >属性->Subversion选项夹->properties->add,然后在弹出的窗口中的property name选择“svn:needs-lock”,值任意,然后选择OK。之后再提交“介绍.doc”即可。


2)第二步,获取锁

在设定了这个属性之后,我们要想修改“介绍.doc”,就必须首先获得锁。

使用命令行操作如下:
svn lock 介绍.doc
这样“介绍.doc”就变成了可写文件,你可以进行编辑修改了,这个时候如果有人和你一样期望获得这个文件的锁就会得到错误的提示,表示文件已经被你锁定了。

使用TortoiseSVN获取锁
操作依然简单,“介绍.doc”右键选中-> TortoiseSVN -> Get Lock... ,然后输入锁定的注释,选择“OK”,既完成了锁定。 

3)第三步,释放锁

当你完成了修改,选择提交后,默认就会释放锁,别人就可以重新获得锁。当然你也可以放弃修改,直接选择释放锁。

命令操作如下:
svn unlock 介绍.doc
这样“介绍.doc”就重新变成只读,别人就可以获得锁并进行修改了。

使用TortoiseSVN的操作:
“介绍.doc”右键选中-> TortoiseSVN -> Release Lock,然后选择确认即可。

2,自动化属性

如果有很多文件需要做锁定属性的设置该如何处理。这时可能就需要自动化属性功能,通过文件名匹配的方式将某类文件设置某种属性。我们还是以Word文档为例,设定将所有Word文档设置为只读。

这里我们用到了Subversion的运行配置区特性,Subversion的许多全局的配置参数都是放在运行配置区中,运行配置区实际上就是一个目录,在我的XP操作系统这个目录是“C:\Documents and Settings\jzj\Application Data\Subversion”,其中jzj是我的用户名,在UNIX下这个目录可能是“.subversion”。在这个目录里config文件是客户端操作的一些属性,而servers则是服务器端的属性,这一部分我们要使用config文件。

打开运行配置区的config文件,去掉“enable-auto-props = yes”前面的“#”和空格,然后找到“[auto-props]”小节,增加下面的属性并保存即可实现Word文件的自动添加需要锁定的属性:
*.doc = svn:needs-lock=x

作了这个设置后,以后通过“svn add”和“svn import”添加的*.doc文件都会有“svn:needs-lock”属性,当然你愿意,你也可以把上面的值修改为“* = svn:needs-lock=x”,这样所有新加的文件都是进入了“锁定-编辑-解锁”模型。

注意:这些设置是针对客户端的,其他用户还需要做同样的设置。

3,忽略文件

在执行svn status等操作时,我们不想看到某些文件,就要使用设置属性进行忽略。在Subversion有两种方式进行这个设置,一个是更改全局设置,也就是前面提到的config文件,另一个是使用svn的内置属性“svn:ignore”。

1)使用config的global-ignores配置

假定我们的程序会编译出很多exe文件,如果不使用忽略属性,当我们执行“svn status”结果会是这个样子:
?      admin\test.exe
M      admin\test.txt

为了不让exe文件打扰我们,我们只需找到config文件的[miscellany]小节,修改global-ignores,增加对exe的忽略,我修改后的这一行变成:

global-ignores = *.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store *.exe

然后再执行“svn status”,结果如下:
M      admin\test.txt

2)使用svn的内置属性“svn:ignore”

有时候匹配没有这么普遍,例如Java的工程会在bin目录生成的很多临时Jar文件,我们只需要a.jar,而不希望temp.jar影响我们的视线,所以我们只需要设置bin的属性“svn:ignore”为temp.jar即可,具体设置同上。

使用SVN避免冲突的几条原则

  • 修改本地代码前一定要先从配置库上更新最新的版本,再在此版本上修改。
  • 修改完后即时提交。
  • 对于无法合并的文件(比如二进制文件,像word),我们一定要设置文件的只读属性并锁定文件后再修改。
  • 如果文件是只读状态的,我们一定要通过获取锁的方式来修改文件的可写属性,而不能直接在本地修改。

猜你喜欢

转载自jiangzhengjun.iteye.com/blog/479812
svn