SVN学习

SVN学习

现实中开发软件时可能会遇到的问题:

代码管理混乱

备份多个版本,占用磁盘空间大

解决代码冲突困难

容易引发BUG

难于追溯问题代码的修改人和修改时间

难于恢复至以前正确版本

无法进行权限控制

项目版本发布困难

发展过程:

CVSàSVN,做不到分布式管理,相当于一个服务器,有网才行

微软的vss

现在常用的github,它与svn功能相似,针对开源项目管理代码应用较多,可以分布式管理。可以离线可以在线,只要给一个github地址就可以上传了。

 

版本迭代开发

         在原版本的基础上开发,如果发现原版本的系统有bug,怎么办呢?

 

1、仓库

创建仓库:利用svnadmin create 命令创建。

 

上面的命令指的是在指定的目录下创建一个仓库。

 

仓库中都有些什么呢?

Conf:是配置文件的位置

 

Db:存放数据的。

 

hooks:里面是一系列的脚本(也叫钩子)。Svn可以编辑脚本。

 

locks:对文件上锁。

 

2、启动仓库的两种方式

  1. 命令启动:svnserve –d –r 文件路径

    1.1  检查仓库是否启动:netstat –an

    上面的这个命令可以检查端口号,一般svn默认的端口号是3690.

     

    说明该端口号正在被监听

但是:

当把命令窗口关闭以后,监听就没有了,所以这种启动方式必须把命令窗口打开。

     

因此常用第二种启动方式。

2. Windows服务启动

2.1 创建启动服务

执行启动命令:

 

sc create SVN-Service binpath= "D:\SVNInstall\bin\svnserve.exe --service -r D:\svnWorkSpace\repository" displayname= "SVN-Service" start= “auto” depend= “Tcpip”

 

  binpath为执行命令所在的路径

  -r 为仓库的路径:这里配置的多仓库,只查询到仓库存放的地址。

  也就是说可以在svn下建立很多仓库,例如建立itcast仓库

  访问的时候:svn://localhost/itcast。建立oa,则访问的时候

  svn://localhost/oa

  如果路径改为D:\svnWorkSpace\repository\041701,只能访问041701这一个仓库。

   

各选项代表的意义:

   

创建成功以后,会在系统的服务中产生一个service

   

这里是没有启动的,需要手动的点击启动。

2.2 删除服务

  执行命令:sc delete SVN-Service

3、 Svn命令

仓库一般放在服务器中,因此不能直接从命令行操作仓库;而是使用客户端对仓库的内容进行操作。

3.1 svn checkout 命令

  把仓库中的某一个项目checkout出来。

  svn checkout svn://localhost/itcast F:\develop\workroom\user

3.2 建立用户

  创建一个客户端操作文件夹

  F:\work\course\svn\develop

  在该文件夹下建立两个文件夹,分别代表用户user1和user2

   

  Develop是相当于开发者

   

  User1、user2是模拟两个开发者

3.3 模拟用户操作仓库

  使用checkout命令把itheima18仓库checkout到user1目录下

   

  操作后

   

  注意:这种文件有时候会被隐藏起来,因此要显示隐藏的文件夹才可以看见。从文件的属性中可以看到当前文件夹中有几个文件。

  这里会默认根据库名寻找到本地的库。

3.4 使用add命令

   

  说明:把a.txt加入到了itcast仓库,加入到了版本控制中

3.5 commit命令

  说明:当把一个文件加入到指定仓库以后,接下来的操作就是提交。在提交的时候必须写一些说明(可以写这次提交都做了一些什么内容)

   

  这是没有说时的提交状态,会报错,提示要使用说明:使用说明的好处是,如果一个时间范围内提交了多个文件,不知道现在提交的是什么 了,因此需要写下提交信息。

   

  这里还是现实认证失败。

  为什么会认证失败呢?

  因为这里是不允许匿名用户登录的。

   

  

  所以需要允许匿名用户登录

   

  

  这个错误是刚才的修改的参数前面有一个空格,导致不能连接到库。

  修改以后再提交:

   

  再使用svn中checkout命令将库拷贝到user2中:

   

  结果:

   

  这就把库中修改后的文件拷贝下来了。

  然后再修改再使用add命令和commit命令上传到库中,别人在使用checkout拷贝下来的。

   

  这个过程的步骤:

   

  主要用到的就是checkout、commit、update这三个命令

    但是用命令太费劲了,实际应用时是用图形化界面来做的。实际在使用图形化界面做相应操作时,其底层就是用的这些命令来完成的。

 

4、Tortoisesvn的使用

  这是svn的客户端也分为32bit和64bit。需要安装在电脑上。

  怎么测试安装成功了呢?

  当对着一个文件夹右键时出现下图:

   

  这就是svn的客户端安装成功了

4.1 新建一个库

  右键单击需要被设置成库的文件夹:

   

4.2 建立用户

  先建立两个文件夹user3和user4

  然后打开user3文件夹,右键单击

   

然后。。

   

然后。。

   

在这里有时候会出现如下错误(尤其是64bit的)

   

分析:

期望文件格式是1~4之间的,但是现有格式是6。需要找这个错误。

  1. 因为是仓库的文件格式,所以到仓库中去找
  2. 找仓库的数据,即db文件夹
  3. 其中有个format文件
  4. 把其中的6改成1~4之间的数值就可以了

   

 

4.3 利用add把指定文件添加到版本控制

 1. 先在user3的仓库中新建一个文件aa.txt

   

  2. 然后commit

   

  然后会出现如下对话框,在commit时需要说明

   

  但是报错了,说认证失败

  

  因为匿名登录文件没有更改

  更改以后。。

   

  3.然后再user4中checkout

   

  4.更改user4中的aa.txt文件

  5.user4中commit该文件

  6.在user3中update该文件

 

5、权限问题

  权限不管在哪都有这两个问题

  认证 authentication:用户登录系统

  授权 authorization:某一个用户针对某种资源的一个授权

5.1 Svnserve.conf文件

  定义所有认证和授权政策

  Svn中权限的设置在conf文件夹下的svnserve.conf文件中

   

  

  在哪进行认证

  

  在哪进行授权

  

 

5.1.1 anon-access

  匿名用户的访问权限,应该是什么访问权限都没有

         anon-access = none

5.1.2 auth-access

  认证用户授权

     auth-access=write

5.1.3 password-db

  指定用户的认证文件为passwd文件

  password-db=passwd

5.1.4 authz-db

  authz-db=authz

  指定用户的授权文件为authz。

5.2 passwd文件

  存放项目成员账户信息

    [users]

    # harry = harryssecret

    # sally = sallyssecret

  等号左边代表用户名,等号右边代表密码,所以可以这么添加:

    user1=user1pwd

    user2=user2pwd

  这样系统中有两个用户user1,user2,密码分别是user1pwd,user2pwd。

   

  

  添加用户名和密码:

  

5.3 authz文件

  复杂的群主授权控制

           [groups]

    # harry_and_sally = harry,sally

    # harry_sally_and_joe = harry,sally,&joe

 

     groups是组的意思

     等号左边的是组名,等号右边的是组的成员

  所以可以写

    svn_group = user1    把user1加入到svn_group组中

 

     # [repository:/baz/fuz]

   # @harry_and_sally = rw

   # * = r

 

  # [repository:/baz/fuz]:指出针对哪个仓库

  # @harry_and_sally = rw:针对某一个仓库,对组进行授权

  # * = r:对除了这个组以外的其他用户进行授权

 

  [itcast:/]:针对itcast仓库

  @svn_group = rw   针对svn_group组进行授权

  user2 = rw         针对user2用户进行授权

  * =  除了以上用户以外的其他用户都不能授权

 

  [itcast:/doc]

  user1 = rw

  * =

  以上配置说明:针对itcast仓库的doc目录,只有user1有读写权利,其他的用户都没有。

   

  

  修改了这些以后,再对user3中的aa.txt文件进行更新,commit,会出现下面的对话框

   

  这里需要填写用户名和密码了,因为刚才已经将匿名用户权限设置了。

   

  然后在user4中进行更新,输入user4的用户名和密码

 

6、 上锁

  可以针对user1用户中的aa.txt文件进行上锁的操作。

   

  

  

  当输入用户名和密码的时候,就上锁了,上锁的突变如下所示:

   

  当用户user2试图再次修改此文件时,会报如下的错误:

   

6.1 解锁

  

 

6.2 needs-lock

  将aa.txt文件变成needs-lock

   

  

 

  添加一个属性:svn:need-lock,值为true,确定以后变成如下的图标:

   

  这个图标表明再次修改必须上锁。

6.2.1 当一个文件needs-lock以后,就不能再进行上锁,修改,和commit操作了;必须要得到锁才能进行这些操作。

   

6.2.2 去除needs-lock属性

   

  

  点击remove就可以了

 

7、 冲突问题

1. 在文件夹中新建一个仓库,创建成仓库。并对仓库中的配置文件进行配置

  

2. 在中新建两个用户,在user1中checkout,将仓库下载到user1中,再新建一个文件,并对a.txt进行编辑,然后add,再commit。

3. 在中checkout,将文件下载到中,并进行修改,然后commit。

4. 在中对进行修改,然后commit,就会引起冲突,如下

   

  这是因为在中对进行修改之前没有update,两个用户都对文件进行了修改和提交,但是没有进行更新,所以引起文件冲突。

5. 当选择update文件时,出现以下几个文件

   

6. 然后选择冲突的文件

   

  

    Theirs表示服务器上的

    Mine 表示自己的

    Merged 表示合并以后的版本

   

  然后选择resolve就解决了冲突

   

  最后commit就可以了。

 

8、SVN嵌入到myeclipse

8.1 下载插件

从官网上下载插件http://subclipse.tigris.org,可以从这个网站下载到最新的svn插件。

8.2 创建插件目录

在F:\work\course\svn下创建插件目录myplugins\svn\eclipse,把下载完的解压后的两个文件夹放入到该目录下

 

8.3 创建SVN.link文件

在myeclipse安装的dropins目录下创建svn.link文件

Link文件中的path

 

path的值就是svn插件的目录所在。

8.4 重启myeclipse

9、SVN在myeclipse中的使用

1. 把库添加到myeclipse中

打开如下的视图:

        

准备新建一个资源库的位置

        

输入库的url:

        

2 把SVN的项目检出到myeclipse中

在新建项目的时候,选择从svn上检出项目

        

选择现有资源库的位置

   

检出的项目在myeclipse中

   

3 对a.txt文件进行编辑

4 commit

5 compare with

        

可以利用Compare with的功能的子功能

基本修订版

                   最新版本的上一个版本

   

6 replesase with

         可以选择某一个版本的内容覆盖当前版本的内容

7 把项目添加到SVN中

新建一个项目,做如下操作:

        

选择svn

   

把项目保存在itcast资源库

   

9.2 分支、可并、切换

1、Trunk:开发主线

存放开发的主线,团队成员在开发的时候一直要用这个库中的内容

2、Branches:存放修复版本

         存放支线副本:当项目稳定以后,先发布到tags下,如果发现了bug,再从tags下检出到branches下。在该版本下进行bug的修复,把修复完毕的稳定的版本重新发布到tags下。

3、Tags:存放稳定版本

         存放标签副本,也就是存放稳定版本

 

9.3开发需求

         一个公司开发了一个oa系统,随后发布了一个版本v1.0,由于这个版本还是比较成功的,然后客户提出了更多的需求,随后开发团地准备开发下一个版本v2.0,当开发团队

在如火如荼的工作的时候,客户突然提出了在v1.0版本有一个bug,需要改进,而且必须把这个改进引入到v2.0版本中。用svn怎么样解决这个问题呢?

 

9.3.1 解决问题

1、在svn库中建立一个项目oa

2、让oa成为svn项目

        

3、  修改权限,让匿名用户具有写的权限

        

4、在客户端准备一个oa文件夹

5、在oa文件夹下建立三个文件夹

        

6、把oa里面的内容导入到svn库中

        

  

7、查看仓库的结构

        

  

  从上面可以看出,branches,tags,trunk已经被加入到仓库中了。

8、把正在开发的一个项目导入到trunk(主线)中

        

  

         这样该项目的基本代码就加入到了trunk中。

9、把trunk的项目check out到myeclipse中。

        

  

  

  

  

  

  

10、发布v1.0版本

        

        

选择发布到tags目录

   

  在tags下建立一个文件夹V1.0

 

11、开发V2.0版本

         在A.java类上稍微做一下修改即可。

12、现在V1.0有bug,对V1.0的版本做出检出

        

  

  

    

13、对V1.0的版本进行修改

14、对修改后的内容进行提交

15、以上操作不对,因为tags的内容不能进行修改

16、

17、对tags中的V1.0做分支

   

         对tags中的V1.0做分支,然后移动到branches中,为V1.0_fixup。

18、切换版本库的路径

   

  把路径切换到branches/V1.0_fixup。

19、提交

  因为版本库已经切换到了branches/V1.0_fixup,所以这个时候可以提交了。

 

20、把修复好的V1.0_fixup发布

        

         选择branches中的版本做分支标记。

   

  发布到稳定库中(tags),并且版本的名字为V1.1

21、把V1.1版本加入到原来的版本中

  在trunk版本中,选择合并。

   

  

  

  从tags/V1.1中进行merge

 

22、在企业的应用

         项目经理会发一个word文档

            1、  svn的仓库的地址

     2、  使用svn的用户名和密码

     3、  把svn上的项目导入到myelicpse中

     4、  做自己的模块,把自己写的东西上传到svn上

     5、  版本的对比,合并版本

 **************************************************特此说明************************************************

本篇文章为本人的学习积累,主要用来个人复习及与爱好编程的朋友共享,如有侵权请联系删除!

posted @ 2018-05-10 14:31  牧火驭风  阅读(701)  评论(0编辑  收藏  举报