第一部分: 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:\bbg不是工作副本。 因为,管理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,修改代码前最后先更新。

最新文章

  1. php5.3到php7.0.x新特性介绍
  2. BOOST1.54简化编译
  3. 细心很重要---猜猜这个SQL执行的什么意思
  4. maven创建web工程,并导入到eclipse中
  5. bzoj1977 [BeiJing2010组队]次小生成树 Tree
  6. C# 添加系统计划任务方案
  7. MSSQL 2005数据库与SP4补丁安装
  8. Container容器控件的使用、Hbox与Vbox布局管理器的使用、以及AjaxAction前后台事件响应
  9. jQuery AJAX实现调用页面后台方法
  10. solrCloud设置Tomcat jvm内存解决内存溢出的问题
  11. Java面向对象概述及三大特征(封装,继承和多态)
  12. NDArray自动求导
  13. pandas之DataFrame
  14. 瘋子C语言笔记 (string)
  15. 整合Spring框架和Hibernate框架
  16. faskclick
  17. Ngram折扣平滑算法
  18. k近邻法(KNN)和KMeans算法
  19. Intellij IDEA 启动项目ClassNotFoundException
  20. springboot使用fastJson作为json解析框架

热门文章

  1. 20169219《Linux内核原理与分析》第八周作业
  2. 开源PCRF、PCRF体验与PCRF实现
  3. 搭建邮件服务器 Postfix + Dovecot (CentOS)
  4. Linux文件锁flock ,检测进程是否已经存在
  5. 关于Android Studio中第三方jar包的Javadoc绑定
  6. 软件测试就业必备知识点&amp;自学软件测试-Dotest-2019
  7. DNS 解析域名以便通过服务器来访问的
  8. matplotlib类
  9. H5切换至后台页面
  10. 老男孩python作业9-简单的商城页面布局