委内瑞拉国有化:Windows 下安装并配置 SVN 服务器全过程

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 05:31:51
最近搭建了一下 SVN 服务器,总结了一下搭建过程,希望可以方便更多的朋友。
1、下载并安装 windows 下 SVN 客户端视图软件“乌龟 SVN”,官网下载地址是:http://tortoisesvn.tigris.org/。32 位 windows 的最新版本是:TortoiseSVN-1.6.7.18415-win32-svn-1.6.9.msi,大小 19 MB,作者上传了一份到 CSDN 资源,下载连接地址:http://download.csdn.net/source/2134092。
乌龟 SVN 安装成功后,打开我的电脑任一文件夹后单击右键,会发现快捷菜单里有了 TortoiseSVN 相关选项。其实乌龟安装不安装无所谓,尤其是对于命令行喜好的朋友。
2、下载 SVN 最新版本安装文件,官网下载地址是:http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100,选择最新发布的 SVN 安装文件进行下载。最新版本是 Setup-Subversion-1.6.5.msi,大小 7.4 MB,作者上传了一份到 CSDN 资源,下载连接地址:http://download.csdn.net/source/2134114。
3、安装 SVN 至我的电脑。最好使用中文路径,而且路径中不要有空格。双击 Setup-Subversion-1.6.5.msi -> 进入 SVN 安装欢迎界面,点击“Next” -> 进入版权相关声明界面,点击“Next” -> 进入安装目录选择界面,作者选择的是 F:\tools\svn,点击“Next” -> 进入安装确认界面,点击“Install” -> 安装结束界面,点击“Finish”结束安装。
打开 C:\AUTOEXEC.BAT 文件进行编辑,添加以下信息:
SET APR_ICONV_PATH="F:\tools\svn\iconv"
重启电脑。
4、创建 SVN 存储库。命令行执行以下命令:
svnadmin create F:\tools\svn\repository
这时候 svn 安装目录下有 repository 文件夹生成。
5、服务器相关配置。打开 F:\tools\svn\repository\conf 目录,打开 svnserve.conf 找到以下两行:
# [general]
# password-db = passwd
去掉每行开头的 #,第二行是指定身份验证的文件名,即 passwd 文件。保存。
同样打开同目录下的 passwd 文件,找到以下几行:
# [users]
# harry = harryssecret
# sally = sallyssecret
去掉每行开头的 #(记住删除 # 后该行前边不可以有空格,不然会出 svn: F:\tools\svn\repository\conf\svnserve.conf:20: Option expected 错误),这是设置用户,一行一个,存储格式为“用户名=密码”,如可插入一行:admin=admin123,即为系统添加一个用户名为 admin,密码为 admin123 的用户。保存。
6、运行 SVN 服务。命令行执行:
svnserve --daemon --root F:\tools\svn\repository
服务启动。当然也可以建立一个批处理文件并放在 windows 启动组中便于开机就运行 SVN服务。
7、创建批处理文件,开机运行 SVN 服务。新建一 notepad 文件,重命名其名为“svnserver.bat”,保存在 F:\tools\svn\svnBat 目录下,编辑其内容如下:
@echo off
SVN 服务器已经启动......
打开注册表编辑器,找到 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run 项,点开类型为“REG_SZ”,名称为“(默认)”的那个选项,数值数据输入 "F:\tools\svn\svnBat\svnserver.bat"。注意一定要带上引号,保存。
再次启动计算机时,SVN 服务即启动。
8、为我们的项目创建版本树。确定 SVN 服务(命令行或者 windows 服务)运行后,新增系统变量“SVN_EDITOR”,值为“C:\WINDOWS\NOTEPAD.EXE”。比如我们的项目名为“myprojects”,新开一 CMD 窗口,命令行执行:
svn mkdir svn://localhost/myprojects
随即关闭记事本打开的 log 文件窗口后按“c”键继续后生成项目树。
生成项目树时需要用户名和密码,输入 passwd 文件里给的用户名 harry,密码 harryssecret 即可。
创建其他项目的版本树操作同上,只需要把“myprojects”换成我们的具体项目名即可。
OK,SVN 服务器安装配置到此结束。局域网内使用
svn://192.168.6.117/myprojects
即可共享项目资源(作者内网 IP 是为 192.168.6.117)。
正确的Windows下安装配置SVN
VC 2010-04-27 10:56:07 阅读39 评论0  字号:大中小
在windows下配置svn服务器
1.下载文件
下载最新版本subversion,我这里选择svn-1.4.5-setup.exe
下载 "Subversion Windows Service" 软件包
下载 TortoiseSVN shell integration utility
2.安装Subversion 服务器
由于我下载的是setup.exe版本,安装程序安装后会自动设置系统变量.如果你下载的是zip版就需要手动设置系统变量.
setup.exe版直接安装就可以了.安装到D:\Program Files\Subversion
首先创建SVN储存库(repository)
svnadmin create F:\svn\
repository创建完毕后会在目录下生成若干个文件和文件夹,dav目录是提供给Apache与mod_dav_svn使用的目录,让它们存储内部数据;db目录就是所有版本控制的数据文件;hooks目录放置hook脚本文件的目录;locks用来放置Subversion文件库锁定数据的目录,用来追踪存取文件库的客户端;format文件是一个文本文件,里面只放了一个整数,表示当前文件库配置的版本号;
3.配置SVN服务器
(这个位置就是在你建储存库的地方F:\svn)
打开/conf/目录,打开svnserve.conf找到一下两句:
# [general]
# password-db = passwd
# anon-access = none
# auth-access = write
去之每行开头的#,其中第二行是指定身份验证的文件名,即passwd文件.anon-access = none 是匿名用户不能访问,必须要有用户名和密码。(注意:问题就出在这,一定要注意格式去掉注释后要顶格不能有空)
同样打开passwd文件,将
# [users]
# harry = harryssecret
# sally = sallyssecret
格式为“用户名 = 密码”,如可插入一行:admin = admin888,即为系统添加一个用户名为admin,密码为admin888的用户
4.运行SVN服务器
运行SVN服务
在命令行执行
svnserve --daemon --root F:\svn
服务启动,--daemon可简写为-d,--root可简写为-r,可以建立一个批处理文件并放在windows启动组中便于开机就运行SVN服务(注意:这是临时打开的服务,命令执行后不能关闭窗口)
用后台服务的方式可以设置开机自动执行。
D:\Program Files\Subversion\bin>sc create svnservice binpath= "d:\Program Files\
Subversion\bin\svnserve.exe --service -r F:\SVN"
就可以用net svnservice stop 或者start来启动服务了 也可以在Sevices.msc来启动了。
5、用客户端访问
格式:svn:\\服务器IP
因为SVN有三种方式实现也就有三种不同的访问格式。
svn 安装备考
环境工具安装 2010-04-26 22:59:46 阅读55 评论0  字号:大中小
今天安装SVN,有一年多不弄这个了,手生了很多,先是让一个同事安装,结果安装了半天啥也没安装上,没办法,还得亲自动手,
这一动手不要紧,好多东西都忘记了,还请教了别人,不过幸而最后安装上了,所以把几个要点记下来。
一、首先是安装的版本,目前安装的是1.3版(服务器端,以前安装成功过1.5版的,这次没有安装),先安装svn-1.3.0-setup.exe,这个没有什么,看你喜好安装在任何地方,然
后安装TortoiseSVN-1.3.2.5840-svn-1.3.0.msi,这个同样,其实安装后者的目的是简化操作,不再使用大量的命令,这个后面会讲。(这里假设svn-1.3.0安装在E:\svn,而
TortoiseSVN-1.3.2安装在默认的C:\Program Files\ TortoiseSVN)
二、下来,安装成功两个软件后,我们在指定的目录下创建一个版本管理库的文件夹,名字假设为myData,(如果想控制多和细一些,可以再向下新建一层目录,如此递推,假设
在E:\myData),然后双击进入文件夹,右键选择TortoiseSVN->Create Repository here,会弹出一个框,选择Native filesystem(FSFS)(这里提一下,安装再高版本时,已不再
弹这个选择框,直接创建即可)如下诸图
图形暂时无法上传
创建成功后目录结构如下图所示,不要轻易改动这个文件夹下的内容
三、配置,打开上面图中的conf文件夹,修改其中的svnserve.confTech
# [general]
# password-db = passwd
改为:
[general]
password-db = passwd
这里注意:一定要把#去掉,同时这两行要顶格到行头,不然报“svnserve.conf header expected:2 …..”下面相同。
最终的样子是这样:
[general]
anon-access = read
auth-access = write
password-db = passwd
realm = projectname(这个是你的工程名)
然后修改同目录的passwd文件
# [users]
# harry = harryssecret
# sally = sallyssecret
改成
[users]
harry = harryssecret
lsally = sallyssecret
g#W其中左侧是用户名,右侧是密码(记住一定要顶格)
如果你还想加新的用户名和密码,可以在新的一行中创建,如:
Name = password
注意:那个authz文件,是用来配置详细的目录控制的,具体可以看帮助文档,原来搞细化分枝控制时弄过一阵子,不过后来没用。
四、启动服务
当Subversion安装成功后,它已经加入到了path中,将我们从网上下载的svnservice.exe拷入到SVN安装目录下的BIN目录下(此处为E:\svn\Subversion\bin),打开CMD并且定位到
安SVN的安装目录下,(注意是SVN而不是TortoiseSVN的目录),
cd  E:\svn\Subversion\bin
svnservice –install –d –r E:\myData
如果出现
svnservice install
commandline set:”-d” “-r” “E:\myData”
表示成功。这里我就走了弯路,前面同事安装时报了失败,总认为出现这个就是错误,结果其实只要不出现下面的失败字样,就是安装成功了。还有一次安装可以启动服务,但起
来后就自动关闭,说没什么事件可做,估计是没有建立库并且配置svnserve.conf等几个文件。
如果出现:
Create svnservice failed
commandline set:”-d” “-r” “E:\myData”
表示失败,则执行:
svnservice –remove
再执行svnservice –install –d –r E:\myData即可。
然后:
sc config svnservice start= auto
net start svnservice
此文件会将SVN变成windows系统的一个服务,并默认为自启动,注意:执行第三句时确保前面以命令行方式运行的SVN服务已经停止,如果没停止可在其窗口中按Ctrl+C中止运行。
后两步也可以在控制面板的服务里将SVN服务设置成自动并启动。
说明:其中在命令末尾加上E:\myData是为了告诉svn我们的资料库都放在了什么地方,加上这个很重要,否则客户端可能会报找不到资料库的错误。
五、导入版本库。
这个是最实际的一环,我们上面折腾那么半天,目的就是为这个。
好,我们用一个简单的方法,不再使用网上的介绍的种种本地库的方法,而是使用在客户端直接导入的方法,简单明了,我也是跟别人学的。
第一种情况:原始文件夹为空:
任一客户端,安装好客户端软件,(注意:是客户端,我没有在服务器安装本地客户端,虽然理论上是可以的,但我还是用的另外的机器)我们使用的是TortoiseSVN-1.4.0.7501-
win32-svn-1.4.0.msi,安装成功后再安装语言包,这样在启动后,即可点击右键,选择设置,在右面的面板里语言改成中文,即可将客户端改成中文界面。
这时我们在实际需要的路径下新建一个文件夹(这里假设是E:\temp),然后进入 此文件夹,选择右键Import(或Export),出现类似下面的一个框,但URL那儿不写图上的写这个:
Svn://192.168.3.220/myData
点OK,会弹出权限验证的对话框,我们输入配置的用户名和密码,然后点击左下角的保存,再点击OK,这样,就从服务器下载了指定的版本控制数据库,然后我们再在temp目录上右键点击Checkout,这样,就会在temp目录下创建一个隐藏的svn配置文件,(你也可以直接在外面导入导出,但会下载你的SVN服务器上的目录,形成类似temp/myData,在myData
上有一个绿色的小对勾,这表明成功了。其实有的时候儿这个反应较慢,你多刷几次就出来了。)其实记得是在所建目录下进行导入就可以了,这样比较简单。
这时,SVN服务器与客户端的通信就完成了,你只要在客户端里(这里指temp/myData中)新建你所需要的目录即可,或者拷贝已有的目录进来,然后点击右键,提交,选中新的文件夹和文件,即可成功提交,这时再在别的客户端里新建目录,直接检出,指定Svn://192.168.3.220/myData,更新,因为允许了任何人read,所以会自动下载下来。
第二种情况:直接在工作目录下提交(即你的使用的本地目录非空)
方法与上面略有不同,我们应该先在你所在的目录(E:\temp)上直接检出,为保证可用,然后再在其目录上直接更新(其实正常情况下可直接进入然后执行下面的动作),这时我们就可以进入目录,将该提交的目录添加,然后再提交。
这里有几个问题:1、有时候儿进去后没有添加这个命令项,你反复更新两次或进出几次目录就OK。
2、如果你按第一种情况直接导入(导出则没有问题)时,如果目录非空,会报一个目录存在的错误,即说明在导入时,会把这些本地的库直接导入到你的当前目录下,造成无法提交和更新。这就是按照SVN帮助上讲的,提交时的目录不能和使用的目录一样,换句话说,必须得换路径。
3、其实可以都使用第二种情况。但为了清楚,分开来讲。
注意:一定要把上面的
[general]
anon-access = read
auth-access = write
password-db = passwd
realm = projectname(这个是你的工程名)
放在[SASL]节前,或者直接把这个节删除,就OK了,今天发现没有处理这项报提交错误,可恨。
这样,整个流程就配置成功了。
MyProcess
WebSharp
Pacer建模
TortoiseSVN使用简介
2009-04-24 来源:dev.idv.tw
· 1 安装及下载client 端
· 2 什么是SVN(Subversion)?
· 3 为甚么要用SVN?
· 4 怎么样在Windows下面建立SVN Repository?
· 5 建立一个Working目录
· 6 新增档案及目录到Repository中
· 7 更新档案及目录
· 8 更新至特定版本
· 9 复制档案及目录
· 10 制作Tag或是Release
11 快速参考
o 11.1 取得(Checkout)Repository
o 11.2 更新(Update)档案或目录
o 11.3 新增(Add)档案或目录
o 11.4 提交(Commit)修改过的档案或目录
o 11.5 Copy/Tag/Branch/Release档案或目录
安装及下载client 端
1 下载Windows 端程序:http://tortoisesvn.net/downloads。一般而言,如果是32-bit的Windows XP 应该使用TortoiseSVN-1.4.x.xxxx-win32-svn-1.4.x.msi 这个档案。如果是64-bit 的操作系统,则应该使用TortoiseSVN-1.4.x.xxxx-x64-svn-1.4.x.msi 这个档案。
2 执行下载回来的TortoiseSVN 安装程序,就会进行TortoiseSVN 的安装。正确安装后,应该进行一次的重开机,以确保TortoiseSVN 的正确无误。
3 安装成功后,在档案管理员内按下鼠标右键,应该可以看到如下的画面:
大部分的TortoiseSVN的操作都是透过档案管理员及鼠标右键就可以完成了。如果您之前使用过TortoiseCVS,应该会对这种操作方式感到十分亲切。
什么是SVN(Subversion)?
有一个简单但不十分精确比喻:
SVN = 版本控制 + 备份服务器
简单的说,您可以把SVN当成您的备份服务器,更好的是,他可以帮您记住每次上传到这个服务器的档案内容。并且自动的赋予每次的变更一个版本。
通常,我们称用来存放上传档案的地方就做Repository。用中文来说,有点像是档案仓库的意思。不过,通常我们还是使用Repository这个名词。基本上,第一次我们需要有一个新增(add)档案的动作,将想要备份的档案放到Repository上面。日后,当您有任何修改时,都可以上传到Repository上面,上传已经存在且修改过的档案就叫做commit,也就是提交修改给SVN server的意思。针对每次的commit,SVN server都会赋予他一个新的版本。同时,也会把每次上传的时间记录下来。日后,因为某些因素,如果您需要从Repository下载曾经提交的档案。您可以直接选择取得最新的版本,也可以取得任何一个之前的版本。如果忘记了版本,还是可以靠记忆尝试取得某个日期的版本。
为甚么要用SVN?
4 备份工作档案是十分重要的。您永远不知道计算机上的硬盘何时会坏掉。根据经验法则再加上摩菲定理,坏事情往往都发生在最重要的时刻。例如,要release东西的前一刻,硬盘完全坏掉,无法修复。所以,常常备份工作数据是非常重要的。大部分公司的server都会有专门的备份机制,甚至是异地备援。绝对比放在自己的计算机里头,或是随身碟上面来的安全。
5 版本控管非常重要。您无法保证手头上最新版本永远都是对的。很多时候,在经过数天努力工作后,您才发现走错方向。需要将所有的修改回复到数天前版本。没有几个人能够完全记住自己修改过什么东西。如果没有做好版本控管,那么,最差的状况就是要全部重来。
6 伙伴间的数据同步也是非常重要的。很多时候,除了您个人外,还有其它的伙伴也需要您的档案。怎么把最新的档案提供给伙伴呢?用e-mail?根据经验,用e-mail是一个很差的办法。到了最后,根本就不知道哪一封e-mail才是新的。因为可能您最新的e-mail已经被当成垃圾信给丢了。别忘了,现在很多e-mail软件都有anti-spam的功能,说不定这些信件都被当成广告信给处理掉了。而且,您也应该知道一般档案如果放在e-mail内,档案大小会变得比较大(通常是原来的4/3倍以上)。如果每天更新一次,恐怕几天没收信的话,信箱就爆了!
7 如果没有一个好的办法,备份不同版本是很耗费硬盘空间的。例如:您有一个总共10MB的目录,使用单纯的档案备份。如果有10个版本就会变成100MB。20个版本就有200MB。如果,不想备份这么多版本,势必就是要减少备份的次数。拉长备份周期将会导致数据遗失的危险性增高。把旧的不需要的备份删除?根据经验,只要时间一拉长,您跟本就不知道一个月以前的版本是重要或者是不重要。
SVN能帮我们解决上面的问题吗?答案是肯定的:
8 SVN Repository可以是自己计算机上的一个目录,或者是随身碟(不建议这样用)。当然也可以是公司的服务器。
9 SVN有很棒的版本控管机制。所有上传的版本都会帮您记录下来。日后您可以随时取得某一个时刻的版本。而且,也有版本分支及合并等好用的功能。
10 SVN可以让不同的开发者存取同样的档案,并且利用SVN Server作为档案同步的机制。也就是说,您有档案更新时,无须将档案寄给您的开发成员。只需要告诉他新的版本已经在SVN Server上面,请他自己去SVN Server上面就可以取得最新版本。而且,SVN Server也可以做到当您上传新版本后,自动发信给相关的成员。
11 SVN的存放档案方式是采用差异备份的方式。也就是说,他只会备份有不同的地方。所以很省硬盘空间。此外,他也可以针对所谓的非文字文件进行差异备份。
怎么样在Windows下面建立SVN Repository?
假设您已经安装前面所提及的TortoiseSVN这套软件,现在我们先告诉您如何用自己的硬盘或是随身碟当作SVN Repository的存放地点。如果您只想知道如何存取一个已经建立好的SVN Server上面的Repository,请直接跳过本节。
假设您的要放置Repository的地方是E槽。您需要先建立一个空的目录。以下面的例子而言,我们在E槽下面建立了一个名为svn_repo的目录。SVN并没有限定Repository目录名称。您可以建立任何您自己喜欢的名称。但是,强烈建议勿使用非英文的档名(如中文或日文)。
透过您的档案管理员,在E:\svn_repo的Icon上面,按下鼠标右键后,选择TortoiseSVN->Create repository here。
接着,您会看到如下的一个窗口,这个窗口主要是问您,您希望使用的Repository数据库格式是FSFS还是BDB。基本上,请选择FSFS就可以了。按下OK按钮后,您将可以看到下一个画面。
这就表示您的SVN repository已经成功的建立了。接下来就是要把您的档案备份进来。日后,只要需要使用这个repository,我们就可以使用file:///E:/SVN_REPO表示它。SVN就是透过这种URL的方式到如何与Repository取得联系。各种URL的格式如下:
file:///磁盘驱动器|/repository所在目录/子目录
http://账号@服务器名称/ repository所在目录/子目录
https://账号@服务器名称/ repository所在目录/子目录
svn+ssh://账号@服务器名称/ repository所在目录/子目录
其中,http表示使用一般的超文字传输通讯协议。https表示使用加密的超文字传输通讯协议。svn+ssh表示透过SSH加密通讯的管道,进行存取。
建立一个Working目录
所谓的Working目录其实就是您平常用来存放工作档案的地方。通常我们会等到自己的工作做的一个段落的时候再进行备份。所以我们平常都是在Working目录下面工作,等到适当时机在commit到repository中。举例来说,我们想在D槽下面建立一个名为working的目录。首先先把这个目录建立出来。
此时,这个目录应该为空的。
在档案管理员中按下右键后(您可以在working目录的icon上按,也可进入working目录后,在空白的地方按),选择SVN checkout。
接着您可以看到如下的画面:
首先我们要填入的是repository的位置,对于SVN来说,repository的位置都是URL。由于我们前面已经在E槽建立一个repository,因此,我们现在要在URL of repository这一栏填入file:///E:/svn_repo/。
接着,稍微看一下Checkout directory,这个字段应该要指向您的working目录。确认后,按下OK按钮,您应该可以看到如下的讯息窗口。
这样就表示动作完成。按下OK按钮后,再到您刚刚建立的目录下。您将会看到working目录下面多了一个名为.svn的目录(这个目录是隐藏的,如果您的档案管理员没有设定可以看到隐藏目录,您将无法看到它) 。
SVN会在您的工作目录下,以及其子目录下建立这个.svn的子目录。您不应该进去这个目录,尤其不应该更动这个目录下面的任何内容。否则会很可能会造成SVN无法正常运作。
由于,原来的repository是空的,所以我们现在的working目录也是空的。如果您现在checkout的是一个已经有内容的repository,您将会看到working目录下面现在多了许多目录及档案。
如果您要在一个已经存在的SVN Server上面checkout出上面的档案,您只需要给定正确的URL以及working目录的名称。就可以取得指定的档案及目录了。
新增档案及目录到Repository中
假设您前面的动作都无误。现在您开始开发一个新的程序。假设您开发的程序将放在前面建立的working目录下面的my_ prj子目录。如下所示:
假设您已经编辑好档案,准备把他们放到SVN的repository中。您需要在my_prj目录的icon上面,按鼠标右键,并且选择TortoiseSVN->Add:
接着,TortoiseSVN会把准备要加入的档案及目录,显示给您看。打勾的就是等下要被加入到Repository中的。如果您有某些档案或是目录不想在这次加入,您可以让该项目不要被勾选。如此,它就不会被加入到Repository去。
按下OK后,您将会看到如下的讯息窗口:
这样就表示成功了。有一点要注意的是,这个Add的动作并未真正的将档案放到Repository中。仅仅是告知SVN准备要在Repository中放入这些档案。此时,如果您透过档案管理员查看这些档案,应该会看到一个白色红底的惊叹号在档案icon的下方。
这是表示您的working目录中的档案与Repository中的档案还没有同步。现在我们要多一个commit的动作。让这些档案真正的放入到Repository中。您可以在my_prj目录的icon上或者是my_prj目录内的空白处按下鼠标右键,叫出如下的选单,并且选择SVN commit。
紧接着,您将会看到如下的窗口出现:
在这个窗口中,下半部会列出一个清单,让您清楚的了解到哪些档案要被commit到repository中。同样的,如果您有档案不想在这个时候commit到Repository,您可以取消选取的档案,这样他们就不会被commit到Repository中。
在档案列表的上方是Message栏,您可以在栏中输入本次commit的目的。这是十分重要的字段,当您commit的次数很多时,可以靠这个讯息知道版本与版本之间的差异。当您输入好Message,按下OK之后,就可以看到如下的窗口出现,通知您已经将指定的档案送到Repository中。
您可以到先前的folder中,确定是否所有的档案icon都有如下的绿色勾勾在上面,这样代表您的档案都正确无误的到repository中。
有时候,因为Windows本身的问题,您可能会看到有些icon没有变成绿色的勾勾。此时,多按F5几次,应该就可以解决这个问题。如果,仍然不行,表示您之前的commit动作真的有问题。请仔细检查之前的commit动作是否正确。
更新档案及目录
为何需要更新?由于版本控制系统多半都是由许多人共同使用。所以,同样的档案可能还有人会去进行编辑。为了确保您工作目录中的档案与Repository中的档案是同步的。建议您在编辑前都先进行更新的动作。在此,我们都先假设您已经将档案check out过一次。现在要说明的是如何在一个check out过的目录进行update。在想要更新的档案或目录icon上面按下鼠标右键。并且选择SVN Update。
正常的状况下,您可以看到如上的窗口。在这个窗口中会显示有哪些文件更新了。如果没有看到档案更新的相关信息,这表示您的目录中的档案已经是最新的,所以无须进行更新。
更新至特定版本
有时我们需要回溯至特定的日期或是版本,这时就可以利用SVN的Update to revision的功能。在想要更新的档案或目录icon上面按下鼠标右键。并且选择TortoiseSVN->Update to revision。
在这个Update窗口中,您可以选择更新到最新版本(HEAD)。也可以选择更新到某个指定的版本(Revision)。当然,您可能早就记不起来正确的版本号码。可能只隐约的记得大概在什么时间。没关系,按下Show log按钮,您就可以回顾历史了。
所有您曾经做过的动作,及其日期与对应的版本都会列在这个窗口上面,只要在你想要的版上面点一下,让他变成反白,然后按下OK。这个版本就会自动填入Update窗口中的Revision字段中。您只要再按下一次OK,这个版本就会被取出来到您的硬盘中。
复制档案及目录
很多时候您会希望有另外一个复制的目录来进行新的编修。等到确定这个分支的修改已经完毕了,再合并到原来的主要开发版本上。举例来说,我们目前在working copy下面有如下的目录及档案:
现在,我们要为trunk这个目录建立一个branch。假设我们希望这个目录是在D:\working\my_prj\branch\my_new_branch_for_testing。首先我们可以在trunk目录下面的空白处,或是直接在trunk的icon下面按下鼠标右键。
在选择Branch/Tag…这个项目后,您将会看到如下的对话框出现。
请先确认From WC at URL: 中的目录是您要复制的来源目录。接着,在To URL中输入您要复制过去的路径。通常我们会将所有的branch集中在一个目录下面。以上面的例子来说,branch档案都会集中在branch的子目录下面。在To URL中您只需要输入您要的目录即可。目录不存在时,会由SVN帮您建立。特别需要注意的是SVN因为斜线作为目录分隔字符,而非反斜线。
接着在Log message输入您此次branch的目的为何。按下OK就可以了。
如果成功,将可以看到下面的画面:
按下OK就可以关闭这个窗口了。如果您此时立刻去working copy的branch子目录下面,您将会失望的发现在该目录下面并没有刚刚指定的目录存在。这是因为您working copy的部份还是旧的,您只需要在branch子目录下面进行SVN update就可以看到这个新增的目录了。新增的目录就与原来的目录无关了。您可以任意对他进行编辑,一直到您确认好所有在branch下面该做的工作都完成后,您可以选择将这个branch merge回原来的trunk目录,或者是保留它在branch中。
要merge回trunk目录中,方法很简单。以上面的例子来说,我们在D:\working\my_prj\trunk目录空白处,按下鼠标右键,选择Merge:
接着可以看到如下的画面:
这个画面主要分为三个部份,前面的From: 与 To: 是要问您打算从Branch中的哪个版本到哪个版本,merge回原来的trunk目录中。因此,From跟To的URL字段应当都是指定原来branch的目录下。剩下的就是指定要merge的revision范围。以上面的例子而言,我们从Branch的Revision 7开始merge到Branch下面的最新版本。您可以透过,Dry run按钮,试作一次Merge。这个merge只会显示一些讯息,不会真正的更新到trunk的目录去。只有按下Merge按钮后,才会真正的将branch的档案与trunk的档案合并起来。
上面的讯息告诉我们在trunk目录下面的yyyy.cpp及xxx1.cpp已经被更改过了。如果您在现在到trunk目录下,会看到这两个档案处于被修改的状态。
如果您确认这次的merge没有问题,您可以直接使用commit来将这两个被修改的档案commit回SVN repository上。如果有问题,您可以直接修改这两个档案,直到确认ok了,再行commit。
一切顺利的话,您就成功的将branch的档案merge回trunk了。
制作Tag或是Release
所谓的Tag或是Release就是一个特别的版本,因为这个版本可能有特别的意义。例如:这个版本是特别的Milestone或是release给客户的版本。其实,Tag与Release的作法与Branch完全相同。只是Branch可能会需要merge回原来的trunk中,而tag及release大部分都不需要merge回trunk中。举例来说,今天我们的trunk做了一版,这个版本被认定是软件的1.0版。1.0版对于开发来说是一个非常重要的里程碑。所以我们要特别为他做一个标记,亦即Tag。假设,这个 1.0版是要正式release给客户或是相关vendor,我们要可以为他做一个Release的标记。基本上,SVN只有目录的概念,并没有什么Tag的用法。所以您会看到再SVN的选单上面,Branch与Tag是同一个项目。以这个1.0的例子来说,我们就是在Trunk上面,按下鼠标右键,选择Branch/Tag的项目:
成功的话,您就在Tag目录下面建立了一个1.0的目录。当然,如果您这时到Tag的目录下面去,会看不到这个目录,您需要在Tag目录下面update一下,才能看到它。
制作Release的作法与Tag完全相同。只是把Tag的目录换成Release而已。
看到这里,相信大家都已经领悟到无论是Branch,Tag或是Release都只是将指定的Trunk版本复制一份到另外一个目录去。至于这个目录要叫Branch还是叫Release,SVN根本就不管。所以,您也可取其它的目录名称。不过,Branch,Tag及Release已经是SVN上面约定成俗的名称。所以,除非您知道自己为何这样做,否则,最好还是follow这个命名原则,以免后面新加入的人看不懂。
NOTE:同样的道理Trunk也只是一个约定成俗的名称。不一定要叫Trunk。只是大家看到Trunk目录就会知道这里面放的是主要的开发主干。
快速参考
前面写了不少废话,主要是给完全没有版本控制观念的人看的。如果你想直接知道某个功能如何使用,请看下面的章节。
在后面的说明,皆以d:\working当作工作目录。您可以将他换成其它任何您想要的目录。
取得(Checkout)Repository
12 开启档案管理员,进入d:
13 在档案管理员空白处按下鼠标右键,选择SVN Checkout
14 在Checkout对话框中,
14 URL of repository:repository的位置。
14 Checkout directory:要存放working copy的地方。
15 若d:\working目录不存在,SVN会问您要不要建立这个目录,请选择Yes。
16 接着按下OK,即可checkout该目录。
更新(Update)档案或目录
17 在您要由repository更新至working copy的档案或是目录的icon上面按下鼠标右键。选择SVN Update即可。
18 如果是要更新至特定的版本,则选择TortoiseSVN->Update to revision。并且在Update对话框中的Revision字段输入您要的版本。也可以透过Show Log按钮来查看版本的信息。
新增(Add)档案或目录
19 在尚不属于repository的档案或目录的icon上按下鼠标右键。选择TortoiseSVN->Add。
20 选取要新增的档案。
21 按下OK。
NOTE:新增的档案要经过提交(Commit)的动作才回真正的放入Repository中。
提交(Commit)修改过的档案或目录
22 在修改过的档案,或是在整个目录的空白处按下鼠标右键。
23 勾选真正要提交至Repository的档案或目录。
24 输入本次提交的纪录讯息(Message)。这个讯息应该要清楚明了,但不应过份简单。以利日后版本追踪。
25 按下OK。
Copy/Tag/Branch/Release档案或目录
26 确认您要处理的档案或是目录已经是Repository中最新的版本。
27 在要处理的目录或是档案上面按下鼠标右键,选择TortoiseSVN->Branch/Tag。
28 在To URL处输入您要的目的地。
28 branch:要产生一个分支。以区别与trunk不同的开发。
28 tag:要形成一个标记,表示重要的milestone。
28 release:表示一个已经正式的release的纪录。
28 其它:进行一个复制(copy)。
| 联系我们| 招聘信息| 火龙果软件|
火龙果软件/UML软件工程组织致力于提高您的软件工程实践能力,我们不断地吸取业界的宝贵经验,向您提供经过数百家企业验证的有效的工程技术实践经验,同时关注最新的理论进展,帮助您“领跑您所在行业的软件世界”。
窗体顶端
常用链接
· 我的随笔
· 我的评论
· 我的参与
· 最新评论
留言簿(2)
· 给我留言
· 查看公开留言
· 查看私人留言
随笔分类
· CM(rss)
· CRM(rss)
· EAM(1)(rss)
· JMS(2)(rss)
· portal(rss)
· 交通行业(rss)
· 代码天地(3)(rss)
· 工作流(rss)
· 电子政务(rss)
· 自来水行业(rss)
· 项目管理(4)(rss)
随笔档案
· 2008年2月 (3)
· 2007年5月 (5)
· 2007年3月 (2)
· 2007年2月 (2)
文章分类
· JMS(rss)
· 业务模型(2)(rss)
· 数据库(1)(rss)
· 电子政务(1)(rss)
· 项目管理(1)(rss)
文章档案
· 2008年10月 (1)
· 2008年2月 (1)
· 2007年5月 (2)
· 2007年3月 (1)
· 2007年2月 (1)
收藏夹
· 业务模型(rss)
· 数据库设计(rss)
搜索
·
最新评论 
· 1. Sozdanie I Prodvijenie Saitov
· 评论内容较长,点击标题查看
· --Sozdanie I Prodvijenie Saitov
· 2. re: 瑞星有点过火了
· 评论内容较长,点击标题查看
· --王子6号
· 3. re: ECSIDE2.0beta版本中关STRUTS提交中正在提交解决暂时解决办法!
· 楼上的 可以试一下把 useAjax ="false"
· --倚楼
· 4. re: ECSIDE2.0beta版本中关STRUTS提交中正在提交解决暂时解决办法!
· webwork+ecside 3.0版点分页或刷新 出现"正在提交"不知道这个问题有没有解决 正在关注...
· --zhanghui
· 5. re: 瑞星有点过火了
· @王子6号
是啊,盗版让中国人都用的起软件了,带来了好处,也带来了坏处,对软件行业是极大的打击。
· --dreamstone
阅读排行榜
· 1. subversion+apache 配置(5099)
· 2. TOMCAT ECLIPSE JVM参数设置(2790)
· 3. jms编程(ibm)(2562)
· 4. activemq的学习之路(1619)
· 5. 正泰EAM产品白皮书(1402)
评论排行榜
· 1. 瑞星有点过火了(5)
· 2. ECSIDE2.0beta版本中关STRUTS提交中正在提交解决暂时解决办法!(2)
· 3. ECSIDE 值得期待表格插件(0)
· 4. activemq的学习之路(0)
· 5. jms编程(ibm)(0)
subversion+apache 配置
注意:目前windows下的subversion只能跟Apache2.0.x配合,不能用于Apache2.2.x,除非你自己编译
在所有的Subversion服务器配置方式中,基于Apache的是最灵活的。虽然配置起来有一点点复杂,但是它提供了其它方式所没有的好处:
WebDAV
基于Apache配置的Subversion服务器使用了被许多其它程序支持的WebDAV协议。举个例子,你可以在Windows的资源管理器中将这样的一个版本
库挂载成一个“Webfolder”,然后像文件系统中的其它文件夹一样访问它。
浏览版本库
你可以在不安装Subversion客户端的情况下,使用浏览器来浏览版本库中的内容。这将使得更大范围的用户可以访问你的数据。
用户验证
你可以使用任何Apache支持的验证机制,包括SSPI和LDAP。
安全
Apache是非常的稳定和安全,因此你的版本库自然而然地拥有同样的安全性。包括SSL加密。
2. 安装过程
2.1. 安装Apache
安装Apache前,你要有一台运行Windows2000、Windows XP + sp1或Windows2003的电脑。
警告:请注意,没安装Service Pack 1的Windows XP将导致错误的网络数据从而破坏你的版本库!
从http://httpd.apache.org/download.cgi 下载最新版本的Apache Web服务器。确保你下载的版本大于2.0.54。2.0.54版本的Apache将不能与
Subversion 1.3.xx配合工作。而且,小于2.0.54的Apache也因为在windows上的编译存在一个bug而导致不能与subversion1.2配合使用。
一旦你已经有了Apache2的安装程序,你可以双击它,它将引导你完成整个安装过程。请确保你输入正确的服务器URL(如果你的服务器没有DNS
名称,你可以直接输入IP地址)。我建议你将Apache安装成 for all Users,on Port 80,as a service。注意:如果你已经有一个IIS或者其它
的程序使用80端口,安装可能会失败。如果是这样,你可以到程序目录下的Apache Group\Apache2\conf目录中找到文件httpd.conf,将其中的
Listen 80改成一个不用的端口,比如Listen 81。然后重新运行这个安装程序,这次应该不会再有问题了。
现在你可以在你的浏览器中键入 http://loccalhost/,如果呈现了一个已经配置好的网站,那么你的Apache就安装成功了。
警告:
如果你将Apache安装成一个服务,它将以本地system帐户来运行。为Apache创建一个单独的用户来运行它将会更安全一些。
请确保运行Apache的用户有版本库的完全访问权限(右键版本库目录->属性->安全)。要不然,用户将无法提交他们的更改。
就算Apache以本机system来运行,你也要设置它能完全读写版本库目录。
如果没有为Apache配置这个许可,用户将会得到"禁止访问"的错误信息,在Apache的错误日志中表现为错误500。
2.2. 安装Subversion
从http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91 (英文)

http://www.iusesvn.com/bbs/forumdisplay.php?fid=7(中文)下载最新版本的Subversion。
运行Subversion安装程序,如果安装程序能够识别你已经安装了Apache,那么你的安装基本上就OK了。如果它不能,那么你要做一些额外的步
骤。
注:如果你先安装Apache,再安装Subversion,正常情况下下面的工作(2.3配置前)Subversion安装程序已经帮你完成了
使用资源管理器,进入Sibversion的安装目录(通常为c:\program files\Subversion),找到文件httpd/mod_dav_svn.so和mod_authz_svn.so
,将它们拷贝到Apache的modules目录(通常为c:\program files\apache group\apache2\modules)。
从Subversion的安装目录拷贝文件libdb43.dll到Apache的modules目录。
使用如记事本之类的文本编辑器编辑Apache的配置文件(通常为c:\program files\apache group\apache2\conf\httd.conf),修改以下内容:
去掉以下行的注释(将开头的#删除):
CODE:
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule dav_module modules/mod_dav.so
在LoadModule节的最后添加以下两行:
CODE:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
2.3. 配置
现在,你已经安装了Apache和Subversion,但是Apache还不知道如果处理像TortoiseSVN一样的Subversion客户端。要让Apache知道哪个URL将
被Subversion使用,你要像下面这样编辑Apache的配置文件(通常在c:\program files\apache group\apache2\conf\httpd.conf):
在配置文件的最后添加下面这些行:
CODE:

DAV svn
SVNParentPath D:\SVN
AuthType Basic
AuthName "Subversion repositories"
AuthUserFile D:\passwd
#AuthzSVNAccessFile D:\svnaccessfile
Require valid-user

这样配置表示:你所有的版本库将位于D:\SVN目录下,要访问你的版本库可以使用这样的URL:http://MyServer/svn/,访问权限将由passwd文
件中的用户名/密码来限制。
要创建passwd文件,可以打开命令行(DOS窗口),将当前目录切换到apache2目录(通常为c:\program files\apache group\apache2),然后打
入以下命令以创建文件:
CODE:
bin\htpasswd -c passwd 
重启Apache服务。
将你的浏览器指向http://MyServer/svn/MyNewRepository(MyNewRepository是你之前创建的Subversion版本库)。如果一切正常,你将被提示
输入用户名密码,输入正确的用户名密码后你就可以看到版本库中的内容了。
对你刚刚输入的apache配置作一些简短的说明:
QUOTE:

意味着可以通过像这样的URL(http://MyServer/svn)来访问Subversion版本库
DAV svn
告诉Apache哪个模块负责服务像那样的URL--在这里就是Subversion模块
SVNListParentPath on
在Subversion 1.3及更高版本中,这个指示器使得Subversion列出由SVNParentPath指定的目录下所有的版本库
SVNParentPath D:\SVN
告诉Subversion在目录D:\SVN下寻找版本库
AuthType Basic
启用基本的验证,比如用户名/密码对
AuthName "Subversion repositories"
当一个验证对话框弹出时,告诉用户这个验证是用来做什么的
AuthUserFile D:\passwd
指定D:\passwd用为密码文件用来验证用户的用户名及密码
AuthzSVNAccessFile D:\svnaccessfile
指定D:\svnaccessfile来限定各个用户或组在版本库中目录的访问权限
Require valid-user
限定用户只有输入正确的用户名及密码后才能访问这个路径
----------------------------------------
上面的配置仅仅是一个简单的示例。你还可以对Apache进行许许多多的配置。
1如果你想让所有用户对版本库都有读的权限而只有特定的用户才有写的权限,你可以将这行
CODE:
Require valid-user
改为
CODE:

Require valid-user

2上面的配置使用了passwd文件将你所有的版本库作为一个单元来限定访问权限。如果你想获得更多的控制,如限定某个用户可以访问版本库中
的哪个目录,可以把下面这行的#去掉:
CODE:
#AuthzSVNAccessFile D:\svnaccessfile
然后用文本编辑器创建一个Subversion授权文件。Apache将确保只有有效的用户可以访问你的/svn位置,然后将用户名传到
AuthzSVNAccessFile模块,这样可以依据Subversion授权文件得到更精细的权限控制。注意,路径将被指定为[库:路径]或者简单的[路径]。如
果你不明确指定一个库,访问规则将应用到由SVNParentPath指定的目录下所有的版本库中。一个授权文件例子可能像这样:
CODE:
[groups]
admin = john, kate
devteam1 = john, rachel, sally
devteam2 = kate, peter, mark
docs = bob, jane, mike
training = zak
# 为所有库指定默认访问规则
# 所有人可以读,管理员可以写,危险分子没有任何权限
[/]
* = r
@admin = rw
dangerman =
# 允许开发人员可以完全访问他们的项目版本库
[proj1:/]
@devteam1 = rw
[proj2:/]
@devteam2 = rw
[bigproj:/]
@devteam1 = rw
@devteam2 = rw
trevor = rw
# 文档编写人员对所有的docs目录有写权限
[/trunk/doc]
@docs = rw
# 培训人员可以完全访问培训版本库
[TrainingRepos:/]
@training = rw
2.4. 使用SSL来保护你的服务器
因为美国出口限制,默认安装的Apache服务器不支持SSL。但是你自己可以很容易地在其它地方下载到所需要的模块,然后安装它。
首先你需要SSL的必需文件。你可以http://hunter.campbus.com/ 或这里找到相应的软件包(或者下载本主题的附件1:
附件: mod_ssl_etc.rar (2006-10-16 15:30, 595.45 K)
该附件被下载次数 110
)。然后只要将包解开将其中的mod_ssl.so拷到Apache的modules目录、openssl.exe、libeay32.dll、ssleay32.dll拷到bin目录、
conf/ssl.conf拷到conf目录。
在Apache的conf目录中用文本编辑器打开ssl.conf。
将下面这些行用#注释掉:
CODE:
DocumentRoot "c:/apache/htdocs"
ServerName www.example.com:443
ServerAdmin you@example.com
ErrorLog logs/error_log
TransferLog logs/access_log
修改
CODE:
SSLCertificateFile conf/ssl.crt/server.crt

CODE:
SSLCertificateFile conf/ssl/my-server.cert
修改
CODE:
SSLCertificateKeyFile conf/ssl.key/server.key

CODE:
SSLCertificateKeyFile conf/ssl/my-server.key
修改
CODE:
SSLMutex file:logs/ssl_mutex

CODE:
SSLMutex default
删除以下两行(如果有,我认为有错,删掉之后apache无法启动):
CODE:


打开Apache配置文件(httpd.conf),去掉这行的注释
CODE:
#LoadModule ssl_module modules/mod_ssl.so
Openssl需要一个配置文件。你可以从这里下载一个可工作的版本http://tud.at/programm/openssl.cnf (或者本主题附件2:
附件: openssl.cnf.rar (2006-9-10 19:11, 1.21 K)
该附件被下载次数 84
)。将它保存到bin/openssl.cnf。
下面你要创建一个SSL证书。你可以打开一个命令行窗口,然后cd到Apache安装目录(比如C:\program files\apache group\apache2),敲入
以下命令:
CODE:
bin\openssl req -config bin\openssl.cnf -new -out my-server.csr
你将被问及一句口令短语。请注意,不要使用简单的几个词,而应该输入一整个句子,比如一篇诗词的一部份,越长越好。同样,你还要输入
你的服务器URL。然后其它的问题都是可选问答的,不过我建议你也将它们填充。
下一步,敲入以下命令:
CODE:
bin\openssl rsa -in privkey.pem -out my-server.key
以及(注意,只有一行)
CODE:
bin\openssl x509 -in my-server.csr -out my-server.cert -req -signkey my-server.key -days 4000
这样将创建一个4000天后才过期的证书。最后敲入:
CODE:
bin\openssl x509 -in my-server.cert -out my-server.der.crt -outform DER
这些命令在Apache目录下创建了一些文件(my-server.der.crt, my-server.csr, my-server.key, .rnd, privkey.pem, my-server.cert)。
将这些文件拷贝到目录conf/ssl
(比如C:\program files\apache group\apache2\conf\ssl),如果目录ssl不存在,你必须先创建一个。
重启Apache服务。
现在可以用类似这样的url来访问你的版本库了https://servername/svn/project
QUOTE:
强制通过SSL来访问
当你配置了SSL来提高版本库安全时,你可能想禁用无SSL的http访问方式,而只允许通过https访问。要达到这种效果,你要在块加
入另外一个指示器SSLRequireSSL。
一个示例块可能像这样:

DAV svn
SVNParentPath D:\SVN
SSLRequireSSL
AuthType Basic
AuthName "Subversion repositories"
AuthUserFile passwd
#AuthzSVNAccessFile svnaccessfile
Require valid-user

以上介绍的配置为Apache多库方式,即一个location可以同时为多个版本库服务,
假设你的ip为192.168.0.1,在D:\SVN目录下建了两个版本库,proj1和proj2
可以分别用下面两个url来访问你的版本库
CODE:
http://192.168.0.1/svn/proj1
CODE:
http://192.168.0.1/svn/proj1
还有一种配置方式为Apache单库方式,即一个location只能为一个版本库服务,
配置时只要将上面的SVNParentPath改为SVNPath,同时将后面的路径由版本库的父目录改为版本库的目录
如:
CODE:

SVNPath D:\SVN\proj1
AuthType Basic
AuthName "Subversion repositories"
AuthUserFile D:\passwd
#AuthzSVNAccessFile D:\svnaccessfile
Require valid-user

posted on 2007-02-26 11:49 李志峰 阅读(5099) 评论(0)  编辑  收藏 所属分类: 项目管理
新用户注册  刷新评论列表
Powered by:
BlogJava
Copyright ? 李志峰
窗体底端
Subversion1.6.6 + apache2.2.14 + windows安装配置
1、下载Apache2.2.14并安装,略。设安装目录为:D:\Program Files\Apache Software Foundation\Apache2.2
2、下载Subversion1.6.6并安装,略。设安装目录为:D:\install\svn-win32-1.6.6
3、假设已安装完成上述软件,整合配置步骤如下:
· 复制D:\install\svn-win32-1.6.6\bin目录下的mod_dav_svn.so,mod_authz_svn.so及 所有dll文件(共17个文件)到D:\Program Files\Apache Software Foundation\Apache2.2\modules目录下。
· D:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf配置文件,找到#LoadModule dav_module modules/mod_dav.so和#LoadModule dav_fs_module modules/mod_dav_fs.so,取消前面的2个“#”。并在LoadModule dav_fs_module modules/mod_dav_fs.so的下一行增加:LoadModule dav_svn_module modules/mod_dav_svn.so和
LoadModule authz_svn_module modules/mod_authz_svn.so,一个语句一行,最后的形式为:
C代码
1 LoadModule dav_module modules/mod_dav.so
1 LoadModule dav_fs_module modules/mod_dav_fs.so
1 LoadModule dav_svn_module modules/mod_dav_svn.so
1 LoadModule authz_svn_module modules/mod_authz_svn.so
· 使用Apache自带的htpasswd工具,生成密码文件(需要建立D:\Program Files\Apache Software Foundation\Apache2.2\conf-svn目录)。命令如下:
C代码
1 D:\Program Files\Apache Software Foundation\Apache2.2\bin>htpasswd -cmb ../conf-svn/passwd test test
·
· 打开配置文件D:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf,在文件最后增加:
C代码
1 #资源库的根位置,多库模式。实际的资源库路径为:D:\svnrepos\testrepo

1     DAV svn
1     SVNParentPath D:\svnrepos       #AuthzSVNAccessFile svnaccessfile
1         AuthType Basic
1         AuthName "Subversion repositories"
1         AuthUserFile "D:\Program Files\Apache Software Foundation\Apache2.2\conf-svn\passwd"
1         Require valid-user

1
1 #单库模式配置方法,根据实际需要选择一种配置方法就行。

1     DAV svn
1     SVNPath D:\svnrep\test
1         AuthType Basic
1         AuthName "Subversion repositories"
1         AuthUserFile "D:\Program Files\Apache Software Foundation\Apache2.2\conf-svn\passwd"
1         Require valid-user

·
· 保存httpd.conf文件,重启Apache,就能访问了。注:多库模式下的访问地址:http://localhost/svn /test;单库模式的访问地址:http://localhost/svn,第一次访问时提示输入用户名密码。使用htpasswd命令中设置的用户名 密码访问。
二.安装配置
首先安装apache,安装过程中会提示填写ServerName等,有的话就填,没有的话就写上IP,我填的是localhost.
安装完apache,如果没有出错的话ApacheMonitor会出现在系统任务栏,并显示已运行状态.
安装svn-1.4.0,安装过程中svn会检测到系统中已经运行apache,apache会在期间自动重新启动,
ApacheMonitor的状态栏也会自动改为"Apache/2.0.55(Win32) SVN/1.4.0 DAV/2",说明svn安装成功.
如果apache和svn没有自动集成成功,也可以手动修改apache httpd.conf文件如下3步:
1.找到以下两行:
#LoadModule dav_module modules/mod_dav.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
改为:
LoadModule dav_module modules/mod_dav.so
#LoadModule dav_fs_module modules/mod_dav_fs.so(网上很多说法是把这一行也去掉#注释,但好像并非必须去掉.)
2.添加以下两行:
LoadModule dav_svn_module "C:/Program Files/Subversion/bin/mod_dav_svn.so"
LoadModule authz_svn_module "C:/Program Files/Subversion/bin/mod_authz_svn.so"
# "C:/Program Files/Subversion"是Subversion的安装目录
3.在httpd.conf的最后添加如下内容:

DAV svn
SVNParentPath "E:/svndemo"
# SVNParentPath指向svn资源库的上一级目录
# SVNPath "E:/svndemo/repository"
# SVNPath指向svn资源库目录
# 使用SVNParentPath或SVNPath根据相应需求
# 关于如何创建svn资源库目录在本文最后有补充

现在已经可以通过http://localhost:8080/svn/repository/来访问资源库了.
三.使用apache身份验证
使用apache身份验证就要使用apache的htpasswd.exe命令生成密码文件,示例如下:
命令行下执行:htpasswd –c E:\svndemo\svn_auth_passwd plmm
参数-c创建密码文件svn_auth_passwd并添加用户plmm,然后会提示输入密码.
继续添加用户:htpasswd -m E:\svndemo\svn_auth_passwd klmm
参数-m在已有的密码文件中添加新用户klmm,并用MD5加密密码.
这样就创建了一个密码文件添加了两个用户.
修改apache httpd.conf文件,添加如下内容:

DAV svn
SVNParentPath "E:/svndemo"
AuthType Basic
AuthName "Subversion repository"
Require valid-user
AuthUserFile "E:/svndemo/svn_auth_passwd"
# AuthUserFile指向密码文件

现在通过http://localhost:8080/svn/repository/访问资源库需要输入用户名密码.
四.结合mysql实现身份验证
1.解压上面下载的mod_auth_mysql-2.0.49-w32.zip文件,拷贝mod_auth_mysql.so文件至apache下modules目录.
2.修改apache httpd.conf文件,添加如下内容:
使apache加载mysql身份验证模块:
LoadModule mysql_auth_module modules/mod_auth_mysql.so
配置apache用来验证用户名密码的数据库表:

DAV svn
SVNParentPath "E:/svndemo"
AuthType Basic
AuthName "Subversion repository"
#AuthUserFile "E:/svndemo/svn_auth_passwd"
Require valid-user
AuthMySQLHost localhost
AuthMySQLUser root
# AuthMySQLUser 数据库登陆用户名
# AuthMySQLPassword 1234
AuthMySQLDB svn
# AuthMySQLDB 数据库名
AuthMySQLUserTable users
# AuthMySQLUserTable 数据库表名
AuthMySQLNameField user_name
# AuthMySQLNameField 用户名字段
AuthMySQLPasswordField user_passwd
# AuthMySQLPasswordField 密码字段
# AuthMySQLMD5Passwords On
AuthMySQLCryptedPasswords Off

3.重启apache,现在通过http://localhost:8080/svn/repository/访问资源库需要输入mysql表中的用户名密码.
五.相关命令
安装apache服务:apache -k install
卸载apache服务:apache -k uninstall
启动apache服务:apache -k start或net start Apache2
停止apache服务:apache -k stop 或net stop Apache2
svn创建资源库:svnadmin create E:\svndemo\repository
启动资源库服务:svnserve -d -r E:\svndemo\repository
拷贝my.ini到c:\winnt
安装MySQL服务:mysqld-nt -install
启动MySQL服务:net start mysql
停止MySQL服务:net stop mysql
卸载MySQL服务:mysqld-nt -remove
1.为什么要用VisualSVN Server,而不用Subversion?
回答:
因为如果直接使用Subversion,那么在Windows 系统上,要想让它随系统启动,就要封装SVN Server为windws service,还要通过修改配置文件来控制用户权限,另外如果要想以Web方式【http协议】访问,一般还要安装配置Apache,如果是新手,岂不是很头痛?而VisualSVN Serve集成了Subversion和Apache,省去了以上所有的麻烦。安装的时候SVN Server已经封装为windws service,Apache服务器的配置也只是在图像界面上,指定认证方式、访问端口等简单操作;另外,用户权限的管理也是通过图像界面来配置。
2.为什么不用TFS?
回答:
因为我们一开始就是用Subversion和TortioseSVN,所以就没有更换其他的软件。至于TFS至今没有用过,其实,我只是看了一些的文章而已,对它也不了解。
3.VisualSVN Server是免费的吗?
回答:
是的,VisualSVN Server是免费的,而VisualSVN是收费的。VisualSVN是SVN的客户端,和Visual Studio集成在一起, VisualSvn Server是SVN的服务器端,包括Subversion、Apache和用户及权限管理,优点在上面已经说过了。
好了,言归正传,正式开始我们今天的教程。
一、VisualSVN Server的配置和使用方法【服务器端】
安装好VisualSVN Server后【安装过程看】,运行VisualSVN Server Manger,下面是启动界面:
好的,下面我来添加一个代码库【Repository】,如下图:
按上图所示,创建新的代码库,在下图所示的文本框中输入代码库名称:
注意:上图中的CheckBox如果选中,则在代码库StartKit下面会创建trunk、branches、tags三个子目录;不选中,则只创建空的代码库StartKit。
点击OK按钮,代码库就创建成功了。
创建完代码库后,没有任何内容在里面。我会在这个教程的第二部分说明如何迁入源代码。
下面,我们开始安全性设置,在左侧的Users上点击右键:
输入上面的信息,点击OK,我们就创建一个用户了。按照上面的过程,分别添加用户Developer1、tester1、manager1,好了,我们开始添加这些用户到我们刚才创建的项目里:
点击上图中的"Add..."按钮,在下图中选择我们刚才添加的用户,点击OK按钮:
说明:大家可能注意到了下图中的Groups,是的,你也可以先创建组,把用户添加到各个组中,然后对组进行授权,操作比较简单,在此略过。
按照下图所示,分别对用户【或组】进行授权:
点击"确定"按钮,上面的用户就具有了访问StartKit代码库的不同权限。
因为用户starter在团队中是新来者,不希望他向代码库中提交新代码,所以他只能读取代码库中的代码,不能提交代码。tester1是测试人员,不负责代码编写,所以也是只读权限。而Developer1和manager1是开发人员和项目经理,自然具有读、写的权限。
在实际的项目开发过程中,Developer和tester往往不可能只有一个人,这时候使用组来授权更加方便,这个大家可以自己练习一下。
二、TotoiseSVN的基本使用方法
在 中,我已经讲解了怎样安装TortoiseSVN。在上面的讲解中已经讲了怎么使用VisualSVN Server了,今天我要讲的是,TortoiseSVN的简单使用方法。
一、签入源代码到SVN服务器
假如我们使用Visual Studio在文件夹StartKit中创建了一个项目,我们要把这个项目的源代码签入到SVN Server上的代码库中里,首先右键点击StartKit文件夹,这时候的右键菜单如下图所示:
图2-2-1
点击Import,弹出下面的窗体,其中 是服务器名,svn是代码仓库的根目录,StartKit是我们在上个教程中添加的一个代码库:
说明:左下角的CheckBox,在第一次签入源代码时没有用,但是,在以后你提交代码的时候是非常有用的。
图2-2-2
点击OK按钮,会弹出下面的窗体,要求输入凭据:
图2-2-3
在上面的窗体中输入用户名和密码,点击OK按钮:
图2-2-4
如上图所示,好了,源代码已经成功签入SVN服务器了。这时候团队成员就可以迁出SVN服务器上的源代码到自己的机器了。
二、签出源代码到本机
在本机创建文件夹StartKit,右键点击Checkout,弹出如下图的窗体:
图2-2-5
在上图中URL of Repository:下的文本框中输入svn server中的代码库的地址,其他默认,点击OK按钮,就开始签出源代码了。
说明:上图中的Checkout Depth,有4个选项,分别是迁出全部、只签出下一级子目录和文件、只签出文件、只签出空项目,默认的是第一项。上面的例子中,我们也可以使用web的方式访问代码库,在浏览器中输入
这时候也会弹出对话框,要求输入用户名和密码,通过验证后即可浏览代码库中的内容。
搞定!源代码已经成功签出到刚才新建的StartKit目录中。
打开StartKit目录,可以看到如下图的文件夹结构:
图2-2-5
一旦你对文件或文件夹做了任何修改,那么文件或文件夹的显示图片机会发生变化。下图中我修改了其中的二个文件:
图2-2-7
大家看一下不同状态所对应的图片:
图2-2-8
我们已经知道怎么将源代码签入到SVN服务器,怎么从服务器签出代码到本机,也简单了解了不同状态所对应的图案啦。
三、提交修改过的文件到SVN服务器
上面的图2-2-7中,我修改了位于Model文件中的二个文件ImageInfo.cs和NewsInfo.cs,下面演示如何提交到SVN服务器。
注意:提交源代码到服务器时,一定确保本机的代码是最新版本,否则可能提交失败,或者造成版本冲突。
在Model文件夹上点击右键或在Model文件下的空白处点击右键,点击SVN Commit…弹出下面的窗体:
图2-2-9
点击OK按钮后,弹出如下图的窗体:
图2-2-10
四、添加新文件到SVN服务器
我们在Model文件下添加一个新的类文件UserInfo.cs,在Model文件下的空白处点击右键,点击SVN Commit…,和上面讲的提交修改过的文件到SVN服务器一样,就可以了。
另外也可以在文件UserInfo.cs上点击右键,点击TortoiseSVN=>>Add,弹出如下图的窗体:
图2-2-11
选中UserInfo.cs文件,点击OK按钮,这样并没有将这个文件提交到SVN服务器,只是将这个文件标记为源代码库库中的文件,并将其状态置为修改状态。之后,我们要再SVN Commit这个文件一次,才可以将其真正提交到SVN服务器上的代码库中。
上面讲是添加文件,实际上,添加文件夹的步骤也是一样的,这里就不说了。
五、更新本机代码与SVN服务器上最新的版本一致
这个也很简单,只要在需要更新的文件夹上点击右键或在该文件下的空白处点击右键,点击SVN Update,就可以了。
注意:更新操作可能会因为版本冲突而失败,这是可以使用合并【Merge】或其他方法解决;也可能因为锁定【Get Lock】而失败,这是需要先解锁【Release Lock】。
六、重命名文件或文件夹,并将修改提交到SVN服务器
只要在需要重命名的文件或文件夹上点击右键,点击TortiseSVN=>>Rename…,在弹出的窗体中输入新名称,点击OK按钮,就可以了。此方法也不是直接重命名,而是将该文件或文件夹的名称标记为重命名后名称,也需要我们使用SVN Commit提交到SVN服务器后才真正重命名。
七、删除文件或文件夹,并将修改提交到SVN服务器
最简单就是,你直接删除文件或文件夹,然后使用SVN Commit提交更新到SVN服务器。另外一种方法是在你要删除的文件或文件夹上点击右键=>>TortoiseSVN=>>Delete删除,此方法也不是直接删除,而是将该文件或文件夹的状态置为删除,也需要我们使用SVN Commit提交到SVN服务器后才真正删除。
说明:实际上,从你把源代码迁签入SVN服务器开始,每一个版本的数据和文件,就算是你已经删除了的,也都可以随时迁出。
以上只是TortoiseSVN最简单的几个功能,其实他的功能远不止这些,其他的功能大家可以在使用的过程中慢慢体会,有些功能我会在下面的教程中使用到,到时候会和大家讲清楚用法。
注意:向SVN服务器提交源代码的时候,一定不要提交bin、obj等文件夹,否则会很麻烦。但是web项目的bin目录除外,但是web项目的bin目录中的引用其他项目而生成的dll不需要提交。
一个好习惯:如果项目中引用了其他的第三方的程序集,比如EnterpriseLibrary、FCKEditor等,这时候不要简单从他们的安装位置引用,而是在你的解决方案下,添加一个Library的目录,把需要的程序集复制到这里,然后从Library目录引用,这样有什么好处,自己想一想吧!
1. export 和check out
export 下载源代码
用法:
1、新建一个空的文件夹,右键点击它,可以看到TortoiseSVN菜单以及上面的SVN Checkout。
2、不用管这个Checkout,我们选择TortoiseSVN菜单下的Export...,接着它会让你输入url。
3、比如输入【迷宫探宝】的SVN地址是:http://game-rts-framework.googlecode.com/svn/trunk/
4、其他选项不需要更改,Omit externals不要勾选,HEAD Revision选中表示最新的代码版本,接着点击OK即可将代码导出到这个目录中:)
check out 意思签出,虽然和Export的效果一样是把代码从服务器下载到本地,但是Checkout有验证的功能,Checkout到某处的代码,将会被TortoiseSVN监视,里面的文件可以享受各种SVN的服务。
2 .每次提交代码需要注意哪些问题
如果你更新了目录中的文件,提交代码需要用到commit功能,commit的功能不仅仅是上传,他会和服务器上面的文件进行对比,假如你更新了某个文件而服务器上面也有人更新了这个文件,并且是在你checkout之后做的更新,那么它会尝试将你的更新和他人的更新进行融合(merge),假如自动merge不成功,那么报告conflict,你必须自己来手动merge,也就是把你的更新和别人的更新无冲突的写在一起。
commit的时候,最好填写Log信息,这样保证别人可以看到你的更新究竟做了写什么。这就相当于上传文件并且说明自己做了那些修改,多人合作的时候log非常重要。
TortoiseSVN的commit只会上传原先checkout然后又被修改了的文件,假如你新加入了某些文件,需要右键点击文件选择Add,然后文件上面会出现一个加号,在下次commit的时候它就会被upload并且被标记为绿色对勾。没有绿色对勾的文件不会被commit。
假如你需要给带有绿色对勾文件改名或者移动它的位置,请不要使用windows的功能,右键点击它们,TortoiseSVN都有相应的操作。想象这些文件已经不在是你本地的东西,你的一举一动都必须让Tortoise知道。
假如修改了某个文件但是你后悔了,可以右键点击它选择Revert,它将变回上次checkout时候的情况。或者Revert整个工程到任意一个从前的版本.
下面描述在使用Commit时的几个注意点:
-------------如有多个文件需要同时提交,同时文件在不同的目录下,必须找到这些文件的最短目录上点击Commit,TortoiseSVN会搜索被点击目录以及该目录下所有的文件,并将修改变动的文件罗列在列表中。
-------------仔细查看列表中的文件,确定哪些文件时需要更新的,如果不需要更新某个已经变化了的文件,只需要在该文件上点击右键,选择还原操作;选择需要新增的文件,不要将临时文件添加到版本库中。
-------------如遇到文件冲突(冲突:要提交的文件已被其他人改动并提交到版本库中)要启用解决冲突功能。
3. 如何保持本地版本和服务器版本同步
使用update来同步本地和服务器上的代码。同样是右键选择SVN update,所有的更改就会从服务器端传到你的硬盘。注意,假如别人删除了某个文件,那么更新之后你在本地的也会被删除。
如果本地的代码已经被修改,和commit一样会先进行merge,不成功的话就会报告conflict
4 如何在同一个在一个工程的各个分支或者主干之间切换
使用tortoise SVN-->switch
在URL中输入branch或trunk的url地址
5.如何比较两个版本之间的差别
本地更改
如果你想看到你的本地副本有哪些更加,只用在资源管理器中右键菜单下选TortoiseSVN→ 比较差异。
与另外一个分支/标签之间的差异
如果你想查看主干程序(假如你在分支上开发)有哪些修改或者是某一分支(假如你在主干上开发)有哪些修改,你可以使用右键菜单。在你点击文件的同时按住Shift键,然后选择TortoiseSVN→ URL比较。在弹出的对话框中,将特别显示将与你本地版本做比较的版本的URL地址。
你还可以使用版本库浏览器,选择两个目录树比较,也许是两个标记,或者是分支/标记和最新版本。邮件菜单允许你使用比较版本来比较它们。阅读第 5.9.2 节 “比较文件夹”以便获得更多信息。
与历史版本的比较差异
如果你想查看某一特定版本与本地拷贝之间的差异,使用显示日志对话框,选择要比较的版本,然后选择在右键菜单中选与本地拷贝比较差异
两个历史版本的比较
如果你要查看任意已提交的两个历史版本之间的差异,在版本日志对话框中选择你要比较的两个版本(一般使用 Ctrl-更改),然后在右键菜单中选比较版本差异
如果你在文件夹的版本日志中这样做,就会出现一个比较版本对话框,显示此文件夹的文件修改列表。阅读第 5.9.2 节 “比较文件夹”以便获得更多信息。
提交所有修改
如果你要在一个视窗中查看某一版本的所有更改,你可以使用统一显示所有比较 (GNU 片段整理)。它将显示所有修改中的部分内容。它很难显示一个全面清晰的比较,但是会将所有更改都集中显示出来。在版本日志对话框中选择某一版本,然后在右键菜单中选择统一显示所有比较。
文件差异
如果你要查看两个不同文件之间的差异,你可以直接在资源管理器中选择这两个文件(一般使用 Ctrl-modifier),然后右键菜单中选TortoiseSVN→ 比较差异。
WC文件/文件夹与URL之间的比较差异
如果你要查看你本地拷贝中的任一文件与版本库中任一文件之间差异,
谴责信息之间的比较差异
如果你要查看的不仅是比较差异而且包括修改该版本的作者,版本号和日期,你可以在版本日志对话框中综合比较差异和谴责信息。这里有更多详细介绍第 5.20.2 节 “追溯不同点”。
比较文件夹差异
TortoiseSVN 自带的内置工具不支持查看多级目录之间的差异,但你可以使用支持该功能的外置工具来替代。在这里 第 5.9.4 节 “其他的比较/合并工具”我们可以介绍一些我们使用过的工具。
6.提交代码时怎样知道自己改了哪些文件,别人改了哪些文件
7. 如何知道某个文件的某一行是谁在哪个版本修改的
8. 如何为一个SVN主工程建立分支或tag
创建分支使用步骤:
1、选择你要产生分支的文件,点击鼠标右键,选择[分支/标记...]
2、在[至URL(T)]输入框中将文件重命名为你的分支文件名,输入便于区分的日志信息,点击确认。
3、在SVN仓库中会复制一个你所指定的文件,文件名称就是你所命名的,但是在你的本地目录上看不到新建的分支文件名,要使你的文件更新作用到你的分支上,你必须选择文件,点击鼠标右键,选择[切换...],选择你重命名的文件,点击确定即可。这样你的本地文件就和分支文件关联上了,不要奇怪,这时本地目录上看到的文件名仍然为旧的文件名。
经验小结:
1、如果操作的文件之前还未提交,而你又想把文件提交到新的分支上,记得一定要选择切换
2、SVN分支的管理实际上就是把不同的分支用不同的文件保存,因此你在取得新版本的时候会发现,不同分支的最新文件也会被获取下来。
创建tag操作,相当于把当前的代码版本复制一份到其他地方,然后以这个地方为出发点进行新的开发,与原来位置的版本互不干扰。
对于branches、tags、trunk这三个目录,并不是subversion必需的,而是被总结的一种良好的团队开发习惯,其使用方法为:
1、开发者提交所有的新特性到主干。 每日的修改提交到/trunk:新特性,bug修正和其他。
2、这个主干被拷贝到“发布”分支。 当小组认为软件已经做好发布的准备(如,版本1.0)然后/trunk会被拷贝到/branches/1.0。
3、项目组继续并行工作,一个小组开始对分支进行严酷的测试,同时另一个小组在/trunk继续新的工作(如,准备2.0),如果一个bug在任何一个位置被发现,错误修正需要来回运送。然而这个过程有时候也会结束,例如分支已经为发布前的最终测试“停滞”了。
4、分支已经作了标签并且发布,当测试结束,/branches/1.0作为引用快照已经拷贝到/tags/1.0.0,这个标签被打包发布给客户。
5、分支多次维护。当继续在/trunk上为版本2.0工作,bug修正继续从/trunk运送到/branches/1.0,如果积累了足够的bug修正,管理部门决定发布1.0.1版本:拷贝/branches/1.0到/tags/1.0.1,标签被打包发布。
一般建立最初的repository时,就建好这三个目录,把所有代码放入/trunk中,如:要将project1目录下的代码导入repository,project1的结构就是:project1/branches,project1/tags,project1/trunk,project1/trunk/food.c,project1/trunk/egg.pc……,然后将project1目录导入repository,建立最初的资料库。然后export回project1,作为本地工作目录。
-----------------------------------------------------------------------------------------------------------------------------------
visualSVN server绿化策略 摆脱两个apache的尴尬
--------------------------------------------------------------------------------
最近把一个老机器改装为Windows 2000 Server作为一般的服务器用,想
在上面装个Subversion服务器,我以前用VisualSVN Server,安装很简单,
可现在发现VisualSVN Server不支持Windows 2000,最后选择的是Apache
和Tigris.org的Subversion的Windows安装包搭建的,其实也不难,现在
简单记录如下:
我用的是这两个软件包:
1. Apache 2.0.63(从http://httpd.apache.org/可以找到)
2. Setup Subversion 1.5.6(从http://subversion.tigris.org/可以找到,
注意是在Documents链接里)
首先是安装Apache和Subversion,然后开始配置:
1. 先准备一个存放Subversion库的目录,例如G:/Subversion/Repos
2. 创建一个Subversion库,例如:
svnadmin create G:/Subversion/Repos/java
其中svnadmin是Subversion带的程序,在Subversion安装目录下的bin目录中。
3. 修改Apache的httpd.conf,加载svn模块
在httpd.conf中加上这句,mod_dav_svn.so的路径根据你Subversion的安装
路径不同而不同
LoadModule dav_svn_module "C:/Program Files/Subversion/bin/mod_dav_svn.so"
4. 创建口令文件
使用apache带的htpasswd.exe可以创建口令文件,例如可以在Apache的bin
目录下执行:
htpasswd -cm ../conf/svn-auth-file testuser
根据提示输入口令后,就可以在Apache的conf下生成一个口令文件svn-auth-file,
其中保存着用户testuser及其加密后的密码
5. 配置svn
修改httpd.cnf,添加如下配置:

DAV svn
SVNParentPath "G:/Subversion/Repos"
AuthType Basic
AuthName "Subversion repository"
AuthUserFile "C:/Program Files/Apache Group/Apache2/conf/svn-auth-file"
Require valid-user

其中我使用的是SVNParentPath而不是SVNPath,这样可以在指定目录下建
多个库,Require valid-user要求所有操作都要对用户进行认证,否则Subvesion
默认是允许匿名用户浏览的。
6. 试试吧
现在就安装完了,重新启动一下Apache就可以试试了:
在浏览器中输入http://servername/svn/java/就可以看到效果了,当然现在是空
的哦,注意,其中svn是DAV svn设定的,java是创建的Subversion库的名字
如果是纯粹局域网内使用,也可以直接用svn通信协议。这样不需要安装或配置apache,并且svn的server在windows上支持启动为service模式。
好处是效率高,配置简单。
不足是不易通过防火墙,另外无法与AD用户关联。
资源网站: UML软件工程组织
自由的天空
简单通用
BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
12 随笔 :: 6 文章 :: 8 评论 :: 0 Trackbacks
<
2007年2月
>







28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1
2
3
4
5
6
7
8
9
10