• svn使用&&常用操作&&问题处理


    第一部分: SVN使用

    svn介绍

      即subversion的简称。 版本控制系统(CVS)包括集中式版本控制系统(CVCS)和分布式版本控制系统(DCVS)。svn是集中式版本控制系统。 可以用于团队合作。 svn用于托管代码。

    svn安装

      谷歌搜索菜鸟教程svn, 就可以搜索到相关信息。 主要步骤如下:

      浏览器中打开: http://subversion.apache.org/packages.html#windows, 选择最后一个安装,进入点击下载setup的, 然后得到下面的目录文件:

      将bin加入系统变量。 然后在cmd中运行 svnserve --help,如果正确则提示相应指令表示成功。

      接着下载下面的小乌龟。

      

      安装即可。小乌龟的作用在于可以使我们操作svn。 

    说明: 第一个下载的是命令行操作,第二个下载的是GUN。 这里主要介绍命令行。 

    svn声明周期

    创建版本库(create): 版本库相当于一个集中的空间,用于存放开发者所有的工作成果。版本库不仅能存放文件,还包括了每次修改的历史,即每个文件的变动历史。

    检出(checkout):Checkout 操作是用来从版本库创建一个工作副本。工作副本是开发者私人的工作空间,可以进行内容的修改,然后提交到版本库中。

    更新(update):顾名思义,update 操作是用来更新版本库的。让我们假设 Tom 和 Jerry 是一个项目的两个开发者。他们同时从版本库中检出了最新的版本并开始工作。此时,工作副本是与版本库完全同步的。然后,Jerry 很高效的完成了他的工作并提交了更改到版本库中。此时 Tom 的工作副本就过期了。更新操作将会从版本库中拉取 Jerry 的最新改动并将 Tom 的工作副本进行更新。当然,这里的更新并不会把Tom的代码弄掉,而是添加了最新版本的代码,Jerry的新代码保留不变。

    执行变更(commit):执行变更最常用的就是编辑。你可以编辑代码,你可以添加文件/目录。但是这些添加的文件目录不会立刻成为版本库的一部分,而是被添加进待变更列表中,直到执行了 commit 操作后才会成为版本库的一部分。Rename 操作可以更改文件/目录的名字。“移动”操作用来将文件/目录从一处移动到版本库中的另一处。

    复查变化(status): 当你检出工作副本或者更新工作副本后,你的工作副本就跟版本库完全同步了。但是当你对工作副本进行一些修改之后,你的工作副本会比版本库要新。在 commit 操作之前复查下你的修改是一个很好的习惯。Status 操作列出了工作副本中所进行的变动。正如我们之前提到的,你对工作副本的任何改动都会成为待变更列表的一部分。Status 操作就是用来查看这个待变更列表。Status 操作只是提供了一个变动列表,但并不提供变动的详细信息。你可以用 diff 操作来查看这些变动的详细信息。

    修复错误(revert): 也就是版本回退。我们来假设你对工作副本做了许多修改,但是现在你不想要这些修改了,这时候 revert 操作将会帮助你。Revert 操作重置了对工作副本的修改。它可以重置一个或多个文件/目录。当然它也可以重置整个工作副本。在这种情况下,revert 操作将会销毁待变更列表并将工作副本恢复到原始状态。

    解决冲突(resolve):合并的时候可能会发生冲突。Merge 操作会自动处理可以安全合并的东西。其它的会被当做冲突。例如,“hello.c” 文件在一个分支上被修改,在另一个分支上被删除了。这种情况就需要人为处理。Resolve 操作就是用来帮助用户找出冲突并告诉版本库如何处理这些冲突。

    提交修改(commit): Commit 操作是用来将更改从工作副本到版本库。这个操作会修改版本库的内容,其它开发者可以通过更新他们的工作副本来查看这些修改。

    第二部分:svn常用操作

    检出

    首先,cmd中进入你希望检出到的文件夹,然后执行下面的命令,即

    svn checkout <svn代码地址> --username=<管理员分配给你的用户名>

    我们也可以写成 svn co 这是svn checkout的简写形式

    如下所示:

    svn checkout http://svn.server.com/svn/project_repo --username=tom

    输入完成之后回车,会提示你输入密码,密码输入正确就可以将代码检出了。

    如下所示:

    最后会提示检出的版本号:

    如果你希望查看更多信息,可以使用svn info,如下所示:

    遇到的问题: 提示D:bg不是工作副本。 因为,管理svn的是在bbg下面的wechattest中,所以应该cd wechattest,如下所示:

    查看当前状态

    svn status

    可以查看当前的状态,如是否修改等。 如果完全没有修改,那么就不会有任何提示。

    添加文件

    如果我们新建了一个文件或者添加了一个文件, 在提交之前需要首先添加到待变更列表中,如下所示:

    svn add <文件名>

    添加了之后,我们就可以通过svn status来检查状态了。 

    如下:

    开始没有任何变化,所以svn status是没有任何结果的,紧接着我新建了一个test.txt文件, 然后检查状态,发现?  , 表示该文件没有添加到待变更列表中, 接着通过svn add <文件名>的方式添加文件到待变更列表中,此时,提示A, A表示成功将文件添加到待变更列表中。

    提交文件

    svn commit -m "第一次提交"

     通过这个命令我们就可以提交文件了。其中的-m后面是一些提交文件的相关信息,方便我们以后作为参考。 如果不输入-m, 那么就会出现多行输入。

    更新文件

    svn update

    一般在提交代码前建议先更新,这样可以避免冲突。

    比较差异

    svn diff

     用于比较文件间的差异

    回退文件

    svn revert <文件名>

     这样可以回退到之前的版本

    查看日志

    svn log

     可以查看日志

    下面的部分摘自:SVN命令使用详解

     1、检出
    svn  co  http://路径(目录或文件的全路径) [本地目录全路径] 

    --username 用户名 --password 密码svn  co  svn://路径(目录或文件的全路径) [本地目录全路径]  --username 用户名 --password 密码
    svn  checkout  http://路径(目录或文件的全路径) [本地目录全路径] --username 用户名
    svn  checkout  svn://路径(目录或文件的全路径) [本地目录全路径]  --username 用户名
    注:如果不带--password 参数传输密码的话,会提示输入密码,建议不要用明文的--password 选项。
      其中 username 与 password前是两个短线,不是一个。
      不指定本地目录全路径,则检出到当前目录下。
    例子:
    svn co svn://localhost/测试工具 /home/testtools --username wzhnsc
    svn co http://localhost/test/testapp --username wzhnsc
    svn checkout svn://localhost/测试工具 /home/testtools --username wzhnsc
    svn checkouthttp://localhost/test/testapp --username wzhnsc

    2导出(导出一个干净的不带.svn文件夹的目录树)
    svn  export  [-r 版本号]  http://路径(目录或文件的全路径) [本地目录全路径] --username 用户名
    svn  export  [-r 版本号]  svn://路径(目录或文件的全路径) [本地目录全路径] --username 用户名
    svn  export  本地检出的(即带有.svn文件夹的)目录全路径  要导出的本地目录全路径
    注:第一种从版本库导出干净工作目录树的形式是指定URL,
       如果指定了修订版本号,会导出相应的版本,
       如果没有指定修订版本,则会导出最新的,导出到指定位置。
       如果省略 本地目录全路径,URL的最后一部分会作为本地目录的名字。
      第二种形式是指定 本地检出的目录全路径 到 要导出的本地目录全路径,所有的本地修改将会保留,
       但是不在版本控制下(即没提交的新文件,因为.svn文件夹里没有与之相关的信息记录)的文件不会拷贝。
    例子:
    svn export
     svn://localhost/测试工具 /home/testtools --username wzhnsc
    svn export
     svn://localhost/test/testapp --username wzhnsc
    svn export
     /home/testapp /home/testtools

    3、添加新文件 
    svn add 文件名
    注:告诉SVN服务器要添加文件了,还要用svn commint -m真实的上传上去!
    例子:
    svn add test.php <- 添加test.php 
    svn commit -m “添加我的测试用test.php“ test.php
    svn add *.php <- 添加当前目录下所有的php文件
    svn commit -m “添加我的测试用全部php文件“ *.php

    4、提交
    svn commit -m “提交备注信息文本“ [-N] [--no-unlock] 文件名
    svn ci -m “提交备注信息文本“ [-N] [--no-unlock] 文件名
    必须带上-m参数,参数可以为空,但是必须写上-m
    例子:
    svn commit -m “提交当前目录下的全部在版本控制下的文件“ * <- 注意这个*表示全部文件
    svn commit -m “提交我的测试用test.php“ test.php
    svn commit -m “提交我的测试用test.php“ -N --no-unlock test.php <- 保持锁就用–no-unlock开关
    svn ci -m “提交当前目录下的全部在版本控制下的文件“ * <- 注意这个*表示全部文件
    svn ci -m “提交我的测试用test.php“ test.php
    svn ci -m “提交我的测试用test.php“ -N --no-unlock test.php <- 保持锁就用–no-unlock开关

    5、更新文件
    svn update
    svn update -r 修正版本 文件名
    svn update 文件名
    例子:
    svn update <- 后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本
    svn update -r 200 test.cpp <- 将版本库中的文件 test.cpp 还原到修正版本(revision)200
    svn update test.php <- 更新与版本库同步。
                提交的时候提示过期冲突,需要先 update 修改文件,
                然后清除svn resolved,最后再提交commit。


    6、删除文件
    svn delete svn://路径(目录或文件的全路径) -m “删除备注信息文本”
    推荐如下操作:
    svn delete 文件名 
    svn ci -m “删除备注信息文本”
    例子:
    svn delete svn://localhost/testapp/test.php -m “删除测试文件test.php”
    推荐如下操作:
    svn delete test.php 
    svn ci -m “删除测试文件test.php”

    7、加锁/解锁 
    svn lock -m “加锁备注信息文本“ [--force] 文件名 
    svn unlock 文件名
    例子:
    svn lock -m “锁信测试用test.php文件“ test.php 
    svn unlock test.php

    8、比较差异 
    svn diff 文件名 
    svn diff -r 修正版本号m:修正版本号n 文件名
    例子:
    svn diff test.php<- 将修改的文件与基础版本比较
    svn diff -r 200:201 test.php<- 对 修正版本号200 和 修正版本号201 比较差异

    9、查看文件或者目录状态
    svn st 目录路径/名
    svn status 目录路径/名<- 目录下的文件和子目录的状态,正常状态不显示 
                 【?:不在svn的控制中;  M:内容被修改;C:发生冲突;
                  A:预定加入到版本库;K:被锁定】 
    svn  -v 目录路径/名
    svn status -v 目录路径/名<- 显示文件和子目录状态
                  【第一列保持相同,第二列显示工作版本号,
                   第三和第四列显示最后一次修改的版本号和修改人】 
    注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,
      原因是svn在本地的.svn中保留了本地版本的原始拷贝。 

    10、查看日志
    svn log 文件名
    例子:
    svn log test.php<- 显示这个文件的所有修改记录,及其版本号的变化 

    11、查看文件详细信息
    svn info 文件名
    例子:
    svn info test.php

    12、SVN 帮助
    svn help <- 全部功能选项
    svn help ci <- 具体功能的说明

    13、查看版本库下的文件和目录列表 
    svn list svn://路径(目录或文件的全路径)
    svn ls svn://路径(目录或文件的全路径)
    例子:
    svn list svn://localhost/test
    svn ls svn://localhost/test <- 显示svn://localhost/test目录下的所有属于版本库的文件和目录 

    14、创建纳入版本控制下的新目录
    svn mkdir 目录名
    svn mkdir -m "新增目录备注文本" http://目录全路径
    例子:
    svn mkdir newdir
    svn mkdir -m "Making a new dir." svn://localhost/test/newdir 
    注:添加完子目录后,一定要回到根目录更新一下,不然在该目录下提交文件会提示“提交失败”
    svn update
    注:如果手工在checkout出来的目录里创建了一个新文件夹newsubdir,
      再用svn mkdir newsubdir命令后,SVN会提示:
      svn: 尝试用 “svn add”或 “svn add --non-recursive”代替?
      svn: 无法创建目录“hello”: 文件已经存在
      此时,用如下命令解决:
      svn add --non-recursive newsubdir
      在进入这个newsubdir文件夹,用ls -a查看它下面的全部目录与文件,会发现多了:.svn目录
      再用 svn mkdir -m "添hello功能模块文件" svn://localhost/test/newdir/newsubdir 命令,
      SVN提示:
      svn: File already exists: filesystem '/data/svnroot/test/db', transaction '4541-1',
      path '/newdir/newsubdir '

    15、恢复本地修改 
    svn revert [--recursive] 文件名
    注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复被删除的目录。
    例子:
    svn revert foo.c <- 丢弃对一个文件的修改
    svn revert --recursive . <-恢复一整个目录的文件,. 为当前目录 

    16、把工作拷贝更新到别的URL 
    svn switch http://目录全路径 本地目录全路径
    例子:
    svn switch http://localhost/test/456 . <- (原为123的分支)当前所在目录分支到localhost/test/456

    17、解决冲突 
    svn resolved [本地目录全路径]
    例子:
    $ svn update
    C foo.c
    Updated to revision 31.
    如果你在更新时得到冲突,你的工作拷贝会产生三个新的文件:
    $ ls
    foo.c
    foo.c.mine
    foo.c.r30
    foo.c.r31
    当你解决了foo.c的冲突,并且准备提交,运行svn resolved让你的工作拷贝知道你已经完成了所有事情。
    你可以仅仅删除冲突的

     参考文档: http://wiki.jikexueyuan.com/project/svn/

    第三部分:SVN问题处理

    问题1:svn管理的代码在修改后并没有出现感叹号,对勾等提示信息。

    解决方法:参考这篇文章

    这是解决问题之后的效果,

    即通过对勾提示我们代码没有修改。

    下面是常见符号的说明:

    黄色感叹号(有冲突):
    --这是有冲突了,冲突就是说你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不允许你提交,防止你的提交覆盖了别人的修改。要解决冲突,如果你确认你的修改是无效的,则用TSVN还原你的修改就行了;如果认为你的修改是正确的,别人的提交是无效的,那么用TSVN先标记为“解决冲突”,然后就可以提交了;如果你认为你的修改和别人的修改都有一部分是有效的,那么你就把别人的修改手动合并到你的修改中,然后使用TSVN标注为“解决冲突”,然后就可以提交了。进入文件夹,寻找有黄色感叹号的文件,这些文件就是发生冲突的地方,根据实际情况处理冲突


    米字号(有本地修改代码):
    --这是说明你有未提交的本地代码。

    问号(新加入的资源):
    --这说明该文件是项目中新增文件资源,新增资源可以是文件、图片、代码等。


    红色感叹号(本地代码与库没有保持一致):
    --这说明本地代码跟库上没有保持一致,如果用户想修复,可以将带红色感叹号图标文件删除,直接update即可。


    灰色向右箭头(本地修改过)
    --本地代码没有及时上库。


    蓝色向左箭头(SVN上修改过)
    --记得更新代码后修改,提交前跟svn对比习惯。


    灰色向右且中间有个加号的箭头(本地比SVN上多出的文件)
    --修改完记得跟svn保持一致


    蓝色向左且中间有个加号的箭头(SVN上比本地多出的文件)
    --删除该文件后,再次更新,将svn上文件全部更新下来。


    灰色向右且中间有个减号的箭头(本地删除了,而SVN上未删除的文件)
    --也就是说你删除确认后,一定要记得上库,跟svn保持一致


    蓝色向左且中间有个减号的箭头(SVN上删除了,而本地未删除的文件)
    --比对svn库上代码,确定需要删除后,更新svn(删除无用代码)。


    红色双向箭头(SVN上修改过,本地也修改过的文件 )
    --这个表示本地和svn上都修改过,最好就是把本地修改合并到svn,修改代码前最后先更新。

  • 相关阅读:
    第三周学习进度
    四则运算之结对开发
    第二周学习进度
    单元测试
    构建之法阅读笔记03
    本周学习进度
    四则运算三
    构建之法阅读笔记02
    本周学习进度
    按照Right-BICEP要求设计的测试用例
  • 原文地址:https://www.cnblogs.com/zhuzhenwei918/p/6824693.html
Copyright © 2020-2023  润新知