SVN基本命令

Posted onetoinf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SVN基本命令相关的知识,希望对你有一定的参考价值。


创建版本

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

Create 操作是用来创建一个新的版本库。大多数情况下这个操作只会执行一次。当你创建一个新的版本库的时候,你的版本控制系统会让你提供一些信息来标识版本库,例如创建的位置和版本库的名字。

svnadmin create /pathto/repository

这里有详细的说明

检出操作

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

svn  checkout  http://路径(目录或文件的全路径) [本地目录全路径] --username 用户名
svn  checkout  svn://路径(目录或文件的全路径) [本地目录全路径]  --username 用户名

# 例子:
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

注:如果不带--password 参数传输密码的话,会提示输入密码,建议不要用明文的--password 选项。
   其中 username 与 password前是两个短线,不是一个。
   不指定本地目录全路径,则检出到当前目录下。

检出用户权限之内的仓库到当前目录

D:\\SRC\\SVNdemo                                               
λ svn checkout svn://192.168.56.101/whoami --username=iamwho 
Checked out revision 0.                                      
                                                             
D:\\SRC\\SVNdemo                                               
λ ls                                                         
whoami/                                                      
                                                 
D:\\SRC\\SVNdemo                                               
λ ls -a whoami\\                                              
./  ../  .svn/                                               

如果是第一进行需要进行认证

λ svn checkout svn://192.168.56.101/whoami --username=iamwho
Authentication realm: <svn://192.168.56.101:3690> c25526d4-9179-46e8-b951-a0ee69630537
Password for 'iamwho': ******
Checked out revision 0.

也可以使用TortoiseSVN进行可视化操作。

导出文件

干净模式

svn  export  [-r 版本号]  http://路径(目录或文件的全路径) [本地目录全路径] --username 用户名
svn  export  [-r 版本号]  svn://路径(目录或文件的全路径) [本地目录全路径] --username 用户名
svn  export  本地检出的(即带有.svn文件夹的)目录全路径  要导出的本地目录全路径

例子:
svn export svn://localhost/测试工具 /home/testtools --username wzhnsc
svn export svn://localhost/test/testapp --username wzhnsc
svn export /home/testapp /home/testtools

注:第一种从版本库导出干净工作目录树的形式是指定URL,
如果指定了修订版本号,会导出相应的版本,
如果没有指定修订版本,则会导出最新的,导出到指定位置。
如果省略 本地目录全路径,URL的最后一部分会作为本地目录的名字。
第二种形式是指定 本地检出的目录全路径 到 要导出的本地目录全路径,所有的本地修改将会保留,
但是不在版本控制下(即没提交的新文件,因为.svn文件夹里没有与之相关的信息记录)的文件不会拷贝。

切换URL

svn switch http://目录全路径 本地目录全路径
例子:
svn switch http://localhost/test/456 . <- (原为123的分支)当前所在目录分支到localhost/test/456

导入文件

svn import [PATH] URL

例子:
svn import /home/testtools svn://localhost/test/testapp --username=user0

将未版本化的文件或树提交到存储库中。

查看相关

目录结构

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

文件信息

svn info 文件名
例子:
svn info test.php

文件内容

svn cat http://文件全路径
例子:
svn cat http://localhost/test/readme.txt
19、新建一个分支copy
svn copy branchA branchB  -m "make B branch" // 从branchA拷贝出一个新分支branchB
20、合并内容到分支merge
svn merge branchA branchB  // 把对branchA的修改合并到分支branchB

文件日志

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

文件状态

使用svn status查看当前状态,其格式

svn st 目录路径/名
svn status 目录路径/名<- 目录下的文件和子目录的状态,正常状态不显示 
             【?:不在svn的控制中;  M:内容被修改;C:发生冲突;
              A:预定加入到版本库;K:被锁定】 
svn  -v 目录路径/名
svn status -v 目录路径/名<- 显示文件和子目录状态
              【第一列保持相同,第二列显示工作版本号,
               第三和第四列显示最后一次修改的版本号和修改人】 

命令帮助

svn help <- 全部功能选项
svn help ci <- 具体功能的说明

文件差异

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

提交更改

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

在提交之前,你必须将文件/目录添加到待变更列表中。列表中记录了将会被提交的改动。当提交的时候,我们通常会提供一个注释来说明为什么会进行这些改动。这个注释也会成为版本库历史记录的一部分。Commit 是一个原子操作,也就是说要么完全提交成功,要么失败回滚。用户不会看到成功提交一半的情况。例如在当前目录中添加一个Python文件,文件的图标会出现一个符号

技术分享图片

以下是在Cmder中的操作

技术分享图片

可以看到Cmder似乎支持(用白色小括号显示当前发生了更改)显示svn status,并且当前目录中有一个预定加入到版本库的文件。

添加文件

使用svn addsvn commit,其一般格式如下

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

添加文件

技术分享图片

svn add返回svn status的状态值,并且小括号变成红色。

提交文件

技术分享图片

提交后svn status值为空并且小括号颜色变回白色。

添加目录

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 ‘

提交更改

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开关

Tortoise图标

使用TortoiseSVN通常图标会发生一定的变化如下

技术分享图片

其中一个文件带着绿色小勾的是已经存在于版本库之中的文件,而本来应该带着问号的toDemo.py是未在版本库之中的。当前添加toDemo.py后又发生如下变化:

技术分享图片

可以看到文件图标上添加了一个蓝色加号,继续提交后

技术分享图片

可以看到文件图标加号变成了绿色小勾了。

通常TortoiseSVN的图标变化如下:

技术分享图片

这是一些常用的,个别可以在 setting --> icon set 中查看

删除文件

其格式一般如下

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”

删除toDemo.py文件

技术分享图片

可以看到文件状态变成D了,继续提交

技术分享图片

加锁解锁

锁定工作拷贝中文件,避免其他用户修改导致冲突。

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

更新版本

顾名思义,update 操作是用来更新版本库的。这个操作将工作副本与版本库进行同步。由于版本库是由整个团队共用的,当其他人提交了他们的改动之后,你的工作副本就会过期。

让我们假设 Tom 和 Jerry 是一个项目的两个开发者。他们同时从版本库中检出了最新的版本并开始工作。此时,工作副本是与版本库完全同步的。然后,Jerry 很高效的完成了他的工作并提交了更改到版本库中。

此时 Tom 的工作副本就过期了。更新操作将会从版本库中拉取 Jerry 的最新改动并将 Tom 的工作副本进行更新。

更新格式

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。
  • 在A端修改文件toTest.py,然后执行提交
  D:\\SRC\\SVNdemo\\iamwho ()
  λ svn status
  M       toTest.py

  D:\\SRC\\SVNdemo\\iamwho ()
  λ svn commit -m "modify the file"
  Sending        toTest.py
  Transmitting file data .done
  Committing transaction...
  Committed revision 4.
  • 在B端进行更新
  D:\\SRC\\SVNdemo\\whoami ()  
  λ svn update toTest.py    
  Updating 'toTest.py':     
  U    toTest.py            
  Updated to revision 4.    
                            
  D:\\SRC\\SVNdemo\\whoami ()  
  λ cat toTest.py           
  # encoding:utf-8          
       
  print("Hello SVN!")       

修复错误

我们来假设你对工作副本做了许多修改,但是现在你不想要这些修改了,这时候 revert 操作将会帮助你。

Revert 操作重置了对工作副本的修改。它可以重置一个或多个文件/目录。当然它也可以重置整个工作副本。在这种情况下,revert 操作将会销毁待变更列表并将工作副本恢复到原始状态。

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

复制分支

完整复制

svn copy URL URL
例子:
svn copy file:///home/c7mon/svn/cellsms/trunk/wwm file:///home/c7mon/svn/cellsms/trunk/tags/wwm_1.0 -m "it's the wwm_1.0 foranhui" 。

完全的服务器端拷贝,通常用在分支和标签。 如wwm项目完成后发布版本wwm_1.0

合并分支

svn 中并无特别的分支操作,可以用copy 或者 checkout一个版本进行操作,主要的是合并操作merge

svn merge SOURCE[@REV] [TARGET_WCPATH]
svn merge [-c M[,N...] | -r N:M ...] SOURCE[@REV] [TARGET_WCPATH]
svn merge SOURCE1[@REV1] SOURCE2[@REV2] [TARGET_WCPATH]

可以使用svn help merge查看具体操作

创建如下的两个分支:

                                 ............
                                .            .
         trunk  --+------------L--------------R------
                   \\                                               \\                          |
                     \\                         v
         feature      +------------------------o-----
                             r100            r200
D:\\SRC\\SVNdemo\\iamwho ()
λ svn copy trunk/ branches/feature
A         branches\\feature

查看状态

D:\\SRC\\SVNdemo\\iamwho ()
λ svn st
A  +    branches\\feature

提交新增的分支到版本库。

D:\\SRC\\SVNdemo\\iamwho ()
λ svn commit -m "add feature"
Adding         branches\\feature
Committing transaction...
Committed revision 8.

进入feature分支操作

D:\\SRC\\SVNdemo\\iamwho\\branches\\feature (branches/feature) 
λ touch index.md                                          

D:\\SRC\\SVNdemo\\iamwho\\branches\\feature (branches/feature) 
λ ls                                                      
HelloWorld.md  index.md  readme                           
                                                          
D:\\SRC\\SVNdemo\\iamwho\\branches\\feature (branches/feature) 
λ svn add index.md                                        
A         index.md                                        
                                                          
D:\\SRC\\SVNdemo\\iamwho\\branches\\feature (branches/feature) 
λ svn commit -m "add a index page"                        
Adding         index.md                                   
Transmitting file data .done                              
Committing transaction...                                 
Committed revision 11.                                               

切换到 trunk ,执行 svn update,然后将 feature 分支合并到 trunk 中。

$ svn merge ../branches/feature                               
--- Merging r9 through r12 into '.':                          
A    index.md                                                 
--- Recording mergeinfo for merge of r9 through r12 into '.': 
 U   .                                                        
                              
$ ls                                                          
HelloWorld.md  index.md  readme                               
                               
$ svn commit -m "add a index page"                            
Sending        .                                              
Adding         index.md                                       
Committing transaction...                                     
Committed revision 13.                                                                                                   

解决冲突

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

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让你的工作拷贝知道你已经完成了所有事情。
你可以仅仅删除冲突的文件并且提交,但是svn resolved除了删除冲突文件,还修正了一些记录在工作拷贝管理区域的记录数据,所以我们推荐你使用这个命令。

标签操作

版本管理系统支持 tag 选项,通过使用 tag 的概念,我们可以给某一个具体版本的代码一个更加有意义的名字。

Tags 即标签主要用于项目开发中的里程碑,比如开发到一定阶段可以单独一个版本作为发布等,它往往代表一个可以固定的完整的版本,这跟 VSS 中的 Tag 大致相同。

在本地工作副本创建一个 tag。

λ svn checkout svn://192.168.56.101/whoami iamwho --username=iamwho
A    iamwho\\branches                                               
A    iamwho\\tags                                                   
A    iamwho\\trunk                                                  
A    iamwho\\toTest.py                                              
Checked out revision 5.   

D:\\SRC\\SVNdemo\\iamwho ()
λ svn copy trunk\\ tags\\v1.0
A         tags\\v1.0

上面的代码成功完成,新的目录将会被创建在 tags 目录下。

D:\\SRC\\SVNdemo\\iamwho ()
λ ls tagsv1.0/

D:\\SRC\\SVNdemo\\iamwho ()
λ ls tags\\v1.0HelloWorld.md  readme

查看状态。

D:\\SRC\\SVNdemo\\iamwho ()
λ svn status
A  +    tags\\v1.0
A  +    tags\\v1.0\\HelloWorld.md
A  +    tags\\v1.0\\readme

提交tag内容。

D:\\SRC\\SVNdemo\\iamwho ()
λ svn commit -m "tags v1.0"
Adding         tags\\v1.0
Adding         tags\\v1.0\\HelloWorld.md
Adding         tags\\v1.0\\readme
Committing transaction...
Committed revision 7.

以上是关于SVN基本命令的主要内容,如果未能解决你的问题,请参考以下文章

svn报错cleanup failed–previous operation has not finished; run cleanup if it was interrupted的解决办法(代码片段

代码仓库:svn和git常用命令合集

git与svn的区别简介git进阶

svn info对应git啥命令

mac终端下svn常用命令

SVN+Ansible搭建自动化提交代码