SVN

2018-04-13 鲁鲁槟 收藏

一、svn 教程

1.1、svn 简介

①、简介

Apache Subversion 通常被缩写成 SVN,是一个开放源代码的版本控制系统,Subversion 在 2000 年由 CollabNet Inc 开发,现在发展成为 Apache 软件基金会的一个项目,同样是一个丰富的开发者和用户社区的一部分。

②、SVN 的一些概念

  • repository(源代码库):源代码统一存放的地方

  • Checkout(提取):当你手上没有源代码的时候,你需要从repository checkout一份

  • Commit(提交):当你已经修改了代码,你就需要Commit到repository

  • Update (更新):当你已经Checkout了一份源代码, Update一下你就可以和Repository上的源代码同步,你手上的代码就会有最新的变更

日常开发过程其实就是这样的(假设你已经Checkout并且已经工作了几天):Update(获得最新的代码) -->作出自己的修改并调试成功 --> Commit(大家就可以看到你的修改了) 。

如果两个程序员同时修改了同一个文件呢, SVN可以合并这两个程序员的改动,实际上SVN管理源代码是以行为单位的,就是说两个程序员只要不是修改了同一行程序,SVN都会自动合并两种修改。如果是同一行,SVN会提示文件Confict, 冲突,需要手动确认。

1.1、windows server 创建 svn 版本库

1.1.1、安装软件

①、Subversion for Windows(svn服务)

安装完成之后进入 cmd ,输入 echo %PATH%,会发现我们的 PATH 环境变量中多了一个 C:\Program Files\TortoiseSVN\bin

01.png

②、TortoiseSVN-1.7.5.22551-win32-svn-1.7.3(svn可视化工具)

1.1.2、创建版本库

①、在D盘创建svn根目录D:\SVN

②、在D:\SVN下创建SVNProject1、SVNProject2两个SVN项目版本库

svnadmin create D:\SVN\SVNProject1 
svnadmin create D:\SVN\SVNProject2

1.1.3、统一配置文件

为便于配置管理,将所有版本库的“账号密码”和“登陆用户权限”等控制文件指定为同一个配置文件

①、从D:\SVN\SVNProject1\conf文件夹下将初始的passwd(账号密码)、authz(用户权限)文件剪切到D:\SVN目录下;

②、修改D:\SVN下的每个项目版本库的\conf\svnserve.conf(访问控制文件)

默认#anon-access = read 去掉首字符"#",none表示不允许匿名访问 
默认#auth-access = write 去掉首字符"#" 
默认# password-db = passwd 改为 password-db = ../../passwd,指向D:\SVN\passwd 
默认# authz-db = authz 改为authz-db = ../../authz,指向D:\SVN\authz
realm = SVNProject1 #仓库名称
(如果有N个版本库则重复N次这样的操作)

1.1.4、配置用户名密码和访问权限

①、用户名

D:\SVN\passwd文件内容的修改:
[左为用户名、右为密码](用户名、密码可根据自己的需要而定)

user1 = user1123 
user2 = user2123

②、访问权限

[groups] 
# harry_and_sally = harry,sally 
svnproject1=user1,user2
svnproject2=user1,
………… 
[/] 
# 指定所有的版本库默认只读
# * = r 
#root可读写 
root = rw 
[SVNProject1:/] 
@svnproject1 = rw 
[SVNProject2:/] 
@svnproject2 = rw

1.1.5、启动 svn

①、方式一:cmd 启动

cd "C:\Program Files\Subversion\bin"
svnserve -d -r D:\SVN

②、方式二:加入系统服务

sc create svn binpath= "C:\Program Files\Subversion\bin\svnserve.exe --service -r D:\SVN" displayname= "Subversion 服务" depend= Tcpip

右键计算机-管理-服务和应用程序-服务(或者win+R  运行 services.msc),找到Subversion 服务,启动它并将其设置为自动启动

ps:如果想删除系统服务,可进入cmd,用 sc delete 服务名称来卸载服务

1.1.6、创建项目

①、建立一个存放项目的文件夹D:\www,并在www文件夹中一次创建SVNProject1文件夹

②、在SVNProject1右键选中SVN Checkout,并在url of repository中输入file:///D:/SVN/SVNProject1,在D:\www\SVNProject1中将会生成.svn的文件夹,表明已将D:\www\SVNProject1文件夹与D:/SVN/SVNProject1仓库关联起来了

③、在SVNProject1中放入源代码,然后TortoiseSVN--Commit提交到repository中

④、SVNProject2项目的创建和SVNProject1类似

1.1.7、本地电脑下载项目

svn://服务器IP地址/SVNProject1
svn://服务器IP地址/SVNProject2

1.1.8、设置 svn 钩子

①、实现功能

windows svn 利用钩子实现代码同步到 web 目录

②、实现方法

在 D:\SVN\SVNProject1\hook 中创建 post.commit.bat

@echo off   
"C:\Program Files\Subversion\bin\svn.exe" update "E:\www\SVNProject1" --quiet --username user1 --password user1123

③、测试

在本地电脑 SVNProject1 提交代码,你会发现服务中同步代码

  • 如果出现:svn upgrade的错误信息

  • 原因:由于服务器和本地的svn 版本不一样。会提示需要执行svn upgrade命令把服务器的的svn版本上迁移到本地的svn版本上去。
    直接执行svn upgrade命令就会把所有的代码按照最新的svn 版本重新更新一遍。之后你操作所有的svn 命令都会正常运行。

  • 解决:

@echo off 
"C:\Program Files\Subversion\bin\svn.exe" upgrade "E:\www\SVNProject1"  
"C:\Program Files\Subversion\bin\svn.exe" update "E:\www\SVNProject1" --quiet --username user1 --password user1123

1.2、linux server 创建 svn 版本库

1.2.1、安装svn

yum install subversion

1.2.2、创建版本库test

mkdir -p /var/svndata/test
svnadmin create /var/svndata/test

进入conf目录

cd /var/svndata/test/conf

①、用户名口令文件passwd

用户名口令文件由svnserve.conf的配置项password-db指定,缺省为conf目录中的passwd。该文件仅由一个[users]配置段组成。

[users]配置段的配置行格式如下:

<用户名> = <口令>

添加一个用户为zhangsan密码123456

vi passwd

添加zhangsan=123456

②、权限配置文件:设置权限

权限配置文件由svnserve.conf的配置项authz-db指定,缺省为conf目录中的authz。该配置文件由一个[groups]配置段和若干个版本库路径权限段组成。

[groups]配置段中配置行格式如下:

<用户组> = <用户列表>

版本库路径权限段的段名格式如下:

[<版本库名>:<路径>]
vi authz

添加如下信息

[groups]
# harry_and_sally = harry,sally
# harry_sally_and_joe = harry,sally,&joe
admin=zhangsan
[/]
@admin=rw
*=r

将zhangsan设置为admin用户组
在本库中,用户组为admin的用户有读写权限,其他用户只有读权限。

移动passwd和authz 到/var/svndata

③、全局配置:svn服务配置文件svnserve.conf

vi svnserve.conf

在最底下添加如下信息

[general]
anon-access = read #匿名用户可读
auth-access = write #授权用户可写
password-db = ../../passwd #使用哪个文件作为账号文件
authz-db = ../../authz #使用哪个文件作为权限文件
realm = test #仓库名称
  • anon-access: 控制非鉴权用户访问版本库的权限,取值范围为"write"、"read"和"none"。 即"write"为可读可写,"read"为只读,"none"表示无访问权限。 缺省值:read

  • auth-access: 控制鉴权用户访问版本库的权限。取值范围为"write"、"read"和"none"。 即"write"为可读可写,"read"为只读,"none"表示无访问权限。 缺省值:write

  • authz-db: 指定权限配置文件名,通过该文件可以实现以路径为基础的访问控制。 除非指定绝对路径,否则文件位置为相对conf目录的相对路径。 缺省值:authz

  • realm: 指定版本库的认证域,即在登录时提示的认证域名称。若两个版本库的 认证域相同,建议使用相同的用户名口令数据文件。 缺省值:一个UUID(Universal Unique IDentifier,全局唯一标示)

启动svn版本库:

svnserve -d -r /var/svndata/

服务器检出:

svn co http://路径(目录或文件的全路径) [本地目录全路径]  --username 用户名 --password 密码
svn checkout http://路径(目录或文件的全路径) [本地目录全路径] --username 用户名
cd /var/www 进入你的www目录
svn co svn://localhost/test

先输入服务器root密码再输入svn的账号密码然后再选择yes

④、客户端检出

svn checkout svn://139.199.201.210/test --username=zhangsan

1.2.3、自动更新

cd /var/svndata/fengyu/hooks
cp post-commit.tmpl post-commit
chmod 755 post-commit
vi post-commit
export LANG=zh_CN.UTF-8
REPOS="$1"
REV="$2"
WEB_PATH=/var/www/test
/usr/bin/svn update $WEB_PATH --username zhangsan--password 123456

1.2.4、SVN 启动模式

①、方法一:指定到版本库的上级目录(称之为多库svnserve方式)

比如在 2.2.2 中

svnserve -d -r /var/svndata/

这种情况,一个svnserve可以为多个版本库工作。

服务器检出:

svn co svn://localhost/test

②、方法二:直接指定到版本库(称之为单库svnserve方式)

svnserve -d -r /var/svndata/test

在这种情况下,一个svnserve只能为一个版本库工作。

authz配置文件中对版本库权限的配置应这样写:

[test:/]
@admin=rw
user2=r

[test01:/]
@admin=rw
user2=r

如果此时你还用[/],则表示所有库的根目录,同理,[/src]表示所有库的根目录下的src目录。

服务器检出:

svn co svn://localhost

1.3、Subversion的组件

Subversion安装之后,分为几个部分,这是一个快速浏览。

  • svn:命令行客户端。

  • svnversion:报告工作拷贝状态(当前修订版本的项目)的工具。

  • svnlook:检查版本库的工具。

  • svnadmin:建立、调整和修补版本库的工具。

  • svndumpfilter:过滤Subversion版本库转储文件的工具。

  • mod_dav_svn:Apache HTTP服务器的一个插件,可以让版本库在网络上可见。

  • svnserve:一种单独运行的服务器,可以作为守护进程由SSH调用,另一种让版本库在网络上可见的方式。

1.4、SVN 解决冲突

①、版本冲突原因

假设 A、B 两个用户都在版本号为 100 的时候,更新了 kingtuns.txt 这个文件,A 用户在修改完成之后提交 kingtuns.txt 到服务器, 这个时候提交成功,这个时候 kingtuns.txt 文件的版本号已经变成 101 了。同时B用户在版本号为 100 的 kingtuns.txt 文件上作修改, 修改完成之后提交到服务器时,由于不是在当前最新的 101 版本上作的修改,所以导致提交失败。

②、解决冲突

我们已在本地检出 runoob01 库,下面我们将实现版本冲突的解决方法。

我们发现 HelloWorld.html 文件存在错误,需要修改文件并提交到版本库中。

我们将 HelloWorld.html 的内容修改为 "HelloWorld! https://www.lulublog.cn"。

用下面的命令查看更改:

svn diff
Index: HelloWorld.html
===================================================================
--- HelloWorld.html     (revision 5)
+++ HelloWorld.html     (working copy)
@@ -1,2 +1 @@
-HelloWorld! https://www.lulublog.cn/
+HelloWorld! https://www.lulublog.cn/!

尝试使用下面的命令来提交他的更改:

svn commit -m "change HelloWorld.html first"

Sending        HelloWorld.html
Transmitting file data .svn: E160028: Commit failed (details follow):
svn: E160028: File '/trunk/HelloWorld.html' is out of date

这时我发现提交失败了。

因为此时,HelloWorld.html 已经被 user02 修改并提交到了仓库。Subversion 不会允许 user01(本例使用的 svn 账号)提交更改,因为 user02 已经修改了仓库,所以我们的工作副本已经失效。

为了避免两人的代码被互相覆盖,Subversion 不允许我们进行这样的操作。所以我们在提交更改之前必须先更新工作副本。所以使用 update 命令,如下:

svn update

这边输入"mc",以本地的文件为主。你也可以使用其选项对冲突的文件进行不同的操作。

默认是更新到最新的版本,我们也可以指定更新到哪个版本

svn update -r6

此时工作副本是和仓库已经同步,可以安全地提交更改了

svn commit -m "change HelloWorld.html second"

Sending        HelloWorld.html
Transmitting file data .
Committed revision 7.

1.5、SVN 提交操作

我们在库本版中需要增加一个readme的说明文件。

cat readme 

this is SVN tutorial.

查看工作副本中的状态。

svn status

?       readme

此时 readme的状态为?,说明它还未加到版本控制中。

将文件readme加到版本控制,等待提交到版本库。

svn add readme 

A         readme

查看工作副本中的状态

svn status
  
A       readme

此时 readme的状态为A,它意味着这个文件已经被成功地添加到了版本控制中。

为了把 readme 存储到版本库中,使用 commit -m 加上注释信息来提交。

如果你忽略了 -m 选项, SVN会打开一个可以输入多行的文本编辑器来让你输入提交信息。

svn commit -m "SVN readme."

Adding         readme
Transmitting file data .
Committed revision 8.
svn commit -m "SVN readme."

现在 readme 被成功地添加到了版本库中,并且修订版本号自动增加了1。

1.6、SVN 版本回退

当我们想放弃对文件的修改,可以使用 SVN revert 命令。

svn revert 操作将撤销任何文件或目录里的局部更改。

我们对文件 readme 进行修改,查看文件状态。

svn status

M       readme

这时我们发现修改错误,要撤销修改,通过 svn revert 文件 readme 回归到未修改状态。

svn revert readme 

Reverted 'readme'

再查看状态。

svn status

进行 revert 操作之后,readme 文件恢复了原始的状态。 revert 操作不单单可以使单个文件恢复原状, 而且可以使整个目录恢复原状。恢复目录用 -R 命令,如下。

svn revert -R trunk

但是,假如我们想恢复一个已经提交的版本怎么办。

为了消除一个旧版本,我们必须撤销旧版本里的所有更改然后提交一个新版本。这种操作叫做 reverse merge。

首先,找到仓库的当前版本,现在是版本 22,我们要撤销回之前的版本,比如版本 21。

svn merge -r 22:21 readme

1.7、SVN 查看历史信息

通过svn命令可以根据时间或修订号去除过去的版本,或者某一版本所做的具体的修改。以下四个命令可以用来查看svn 的历史:

  • svn log: 用来展示svn 的版本作者、日期、路径等等。

  • svn diff: 用来显示特定修改的行级详细信息。

  • svn cat: 取得在特定版本的某文件显示在当前屏幕。

  • svn list: 显示一个目录或某一版本存在的文件。

①、svn log

可以显示所有的信息,如果只希望查看特定的某两个版本之间的信息,可以使用:

svn log -r 6:8

如果只想查看某一个文件的版本修改信息,可以使用 svn log 文件路径。

svn log trunk/HelloWorld.html

如果希望得到目录的信息要加 -v。

如果希望显示限定N条记录的目录信息,使用 svn log -l N -v。

svn log -l 5 -v

②、svn diff

用来检查历史修改的详情。

  • 检查本地修改

  • 比较工作拷贝与版本库

  • 比较版本库与版本库

A、如果用 svn diff,不带任何参数,它将会比较你的工作文件与缓存在 .svn 的"原始"拷贝。

svn diff

B、比较工作拷贝和版本库

比较你的工作拷贝和版本库中版本号为 3 的文件 rule.txt。

svn diff -r 3 rule.txt

C、比较版本库与版本库

通过 -r(revision) 传递两个通过冒号分开的版本号,这两个版本会进行比较。

比较 svn 工作版本中版本号2和3的这个文件的变化。

svn diff -r 2:3 rule.txt

③、svn cat

如果只是希望检查一个过去版本,不希望查看他们的区别,可使用svn cat

svn cat -r 版本号 rule.txt

这个命令会显示在该版本号下的该文件内容

④、svn list

svn list 可以在不下载文件到本地目录的情况下来察看目录中的文件:

svn list http://139.199.201.210/test

1.8、SVN分支

Branch 选项会给开发者创建出另外一条线路。当有人希望开发进程分开成两条不同的线路时,这个选项会非常有用。

比如项目 demo 下有两个小组,svn 下有一个 trunk 版。

由于客户需求突然变化,导致项目需要做较大改动,此时项目组决定由小组 1 继续完成原来正进行到一半的工作(某个模块),小组 2 进行新需求的开发。

那么此时,我们就可以为小组2建立一个分支,分支其实就是 trunk 版(主干线)的一个copy版,不过分支也是具有版本控制功能的,而且是和主干线相互独立的,当然,到最后我们可以通过(合并)功能,将分支合并到 trunk 上来,从而最后合并为一个项目。

我们在本地副本中创建一个 my_branch 分支。

ls

branches  tags  trunk

svn copy trunk/ branches/my_branch

A         branches/my_branch

查看状态:

svn status

A  +    branches/my_branch
A  +    branches/my_branch/HelloWorld.html
A  +    branches/my_branch/readme

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

svn commit -m "add my_branch" 

Adding         branches/my_branch
Replacing      branches/my_branch/HelloWorld.html
Adding         branches/my_branch/readme

Committed revision 9.

接着我们就到 my_branch 分支进行开发,切换到分支路径并创建 index.html 文件。

cd branches/my_branch/

将 index.html 加入版本控制,并提交到版本库中。

svn status
?       index.html

svn add index.html 
A         index.html

svn commit -m "add index.html"
Adding         index.html
Transmitting file data .
Committed revision 10.

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

svn merge ../branches/my_branch/

--- Merging r10 into '.':
A    index.html
--- Recording mergeinfo for merge of r10 into '.':
 G   .

此时查看目录,可以看到 trunk 中已经多了 my_branch 分支创建的 index.html 文件。

将合并好的 trunk 提交到版本库中。

svn commit -m "add index.html"

1.9、SVN 标签

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

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

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

svn copy trunk/ tags/v1.0

A         tags/v1.0

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

ls tags/
v1.0

ls tags/v1.0/
HelloWorld.html  readme

查看状态。

svn status
A  +    tags/v1.0

提交tag内容。

svn commit -m "tags v1.0"

二、svn 命令

2.1、svn

①、svn add

A、描述

svn add PATH...

添加文件、目录或符号链到你的工作拷贝并且预定添加到版本库。它们会在下次提交上传并添加到版本库,如果你在提交之前改变了主意,你可以使用svn revert取消预定。

B、选项

  • --targets FILENAME

  • --non-recursive (-N)

  • --quiet (-q)

  • --config-dir DIR

  • --auto-props

  • --no-auto-props

  • --force

C、例子

添加一个文件到工作拷贝

svn add foo.c

当添加一个目录,svn add缺省的行为方式是递归的

svn add testdir

你可以只添加一个目录而不包括其内容

svn add --non-recursive otherdir

通常情况下,命令*svn add 会忽略所有已经在版本控制之下的目录,有时候,你会希望添加所有工作拷贝的未版本化文件,包括那些隐藏在深处的文件,可以使用svn add的--force递归到版本化的目录下

svn add * --force

②、svn blame

A、描述

svn blame TARGET...

显示特定文件和URL内嵌的作者和修订版本信息。每一行文本在开头都放了最后修改的作者(用户名)和修订版本号。

B、别名

praise、annotate、ann

C、选项

  • --revision (-r) REV

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --config-dir DIR

  • --verbose

D、例子

如果你希望在测试版本库看到blame标记的readme.txt源代码

svn blame http://svn.red-bean.com/repos/test/readme.txt

③、svn cat

A、描述

svn cat TARGET[@REV]...

输出特定文件或URL的内容。列出目录的内容可以使用svn list。

B、选项

  • --revision (-r) REV

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --config-dir DIR

C、例子

如果你希望不检出而察看版本库的readme.txt的内容

$ svn cat http://svn.red-bean.com/repos/test/readme.txt
This is a README file.
You should read this.

如果你的工作拷贝已经过期(或者你有本地修改),并且希望察看工作拷贝的HEAD修订版本的一个文件,如果你给定一个路径,svn cat会自动取得HEAD的修订版本

$ cat foo.c
This file is in my local working copy 
and has changes that I've made.

$ svn cat foo.c
Latest revision fresh from the repository!

④、svn checkout

A、描述

svn checkout URL[@REV]... [PATH]

从版本库取出一个工作拷贝,如果省略*PATH*,URL的基名称会作为目标,如果给定多个URL,每一个都会检出到PATH的子目录,使用URL基名称的子目录名称。

B、别名

co

C、选项

  • --revision (-r) REV

  • --quiet (-q)

  • --non-recursive (-N)

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --config-dir DIR

D、例子

取出一个工作拷贝到mine

$ svn checkout file:///tmp/repos/test mine
A  mine/a
A  mine/b
Checked out revision 2.
$ ls
mine

检出两个目录到两个单独的工作拷贝

$ svn checkout file:///tmp/repos/test  file:///tmp/repos/quiz
A  test/a
A  test/b
Checked out revision 2.
A  quiz/l
A  quiz/m
Checked out revision 2.
$ ls
quiz  test

检出两个目录到两个单独的工作拷贝,但是将两个目录都放到working-copies:

$ svn checkout file:///tmp/repos/test  file:///tmp/repos/quiz working-copies
A  working-copies/test/a
A  working-copies/test/b
Checked out revision 2.
A  working-copies/quiz/l
A  working-copies/quiz/m
Checked out revision 2.
$ ls
working-copies

如果你打断一个检出(或其它打断检出的事情,如连接失败。),你可以使用同样的命令重新开始或者是更新不完整的工作拷贝:

$ svn checkout file:///tmp/repos/test test
A  test/a
A  test/b
^C
svn: The operation was interrupted
svn: caught SIGINT

$ svn checkout file:///tmp/repos/test test
A  test/c
A  test/d
^C
svn: The operation was interrupted
svn: caught SIGINT

$ cd test
$ svn update
A  test/e
A  test/f
Updated to revision 3.

⑤、svn cleanup

A、描述

svn cleanup [PATH...]

递归清理工作拷贝,删除未完成的操作锁定。如果你得到一个“工作拷贝已锁定”的错误,运行这个命令可以删除无效的锁定,让你的工作拷贝再次回到可用的状态。

B、选项

  • --diff3-cmd CMD

  • --config-dir DIR

C、例子

svn cleanup没有输出,没有太多的例子,如果你没有传递路径,会使用“.”。

$ svn cleanup

$ svn cleanup /path/to/working-copy

⑥、svn commit

A、描述

svn commit [PATH...]

将修改从工作拷贝发送到版本库。如果你没有使用--file或--message提供一个提交日志信息,svn会启动你的编辑器来编写一个提交信息。

B、别名

ci(“check in”的缩写;不是“checkout”的缩写“co”。)

C、选项

  • --message (-m) TEXT

  • --file (-F) FILE

  • --quiet (-q)

  • --non-recursive (-N)

  • --targets FILENAME

  • --force-log

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --encoding ENC

  • --config-dir DI

D、例子

使用命令行提交一个包含日志信息的文件修改,当前目录(“.”)是没有说明的目标路径:

$ svn commit -m "added howto section."
Sending        a
Transmitting file data .
Committed revision 3.

提交一个修改到foo.c(在命令行明确指明),并且msg文件中保存了提交信息:

$ svn commit -F msg foo.c
Sending        foo.c
Transmitting file data .
Committed revision 5.

如果你希望使用在--file选项中使用在版本控制之下的文件作为参数,你需要使用--force-log选项:

$ svn commit --file file_under_vc.txt foo.c
svn: The log message file is under version control
svn: Log message file is a versioned file; use '--force-log' to override

$ svn commit --force-log --file file_under_vc.txt foo.c
Sending        foo.c
Transmitting file data .
Committed revision 6.

提交一个已经预定要删除的文件:

$ svn commit -m "removed file 'c'."
Deleting       c

Committed revision 7.

⑦、svn copy

A、描述

svn copy SRC DST

拷贝工作拷贝的一个文件或目录到版本库。*SRC和DST*既可以是工作拷贝(WC)路径也可以是URL:

  • WC -> WC:拷贝并且预定一个添加的项目(包含历史)。

  • WC -> URL:将WC或URL的拷贝立即提交。

  • URL -> WC:检出URL到WC,并且加入到添加计划。

  • URL -> URL:完全的服务器端拷贝,通常用在分支和标签。

B、别名

cp

C、选项

  • --message (-m) TEXT

  • --file (-F) FILE

  • --revision (-r) REV

  • --quiet (-q)

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --force-log

  • --editor-cmd EDITOR

  • --encoding ENC

  • --config-dir DIR

D、例子

拷贝工作拷贝的一个项目(只是预定要拷贝―在提交之前不会影响版本库):

$ svn copy foo.txt bar.txt
A         bar.txt
$ svn status
A  +   bar.txt

拷贝你的工作拷贝的一个项目到版本库的URL(直接的提交,所以需要提供一个提交信息):

$ svn copy near.txt file:///tmp/repos/test/far-away.txt -m "Remote copy."

Committed revision 8.

拷贝版本库的一个项目到你的工作拷贝(只是预定要拷贝——在提交之前不会影响版本库):

这是恢复死掉文件的推荐方式!

$ svn copy file:///tmp/repos/test/far-away near-here
A         near-here

最后,是在URL之间拷贝:

$ svn copy file:///tmp/repos/test/far-away file:///tmp/repos/test/over-there -m "remote copy."

Committed revision 9.

这是在版本库里作“标签”最简单的方法―svn copy那个修订版本(通常是HEAD)到你的tags目录。

$ svn copy file:///tmp/repos/test/trunk file:///tmp/repos/test/tags/0.6.32-prerelease -m "tag tree"

Committed revision 12.

不要担心忘记作标签―你可以在以后任何时候给一个旧版本作标签:

$ svn copy -r 11 file:///tmp/repos/test/trunk file:///tmp/repos/test/tags/0.6.32-prerelease -m "Forgot to tag at rev 11"

Committed revision 13.

⑧、svn delete

A、描述

svn delete PATH...

svn delete URL...

*PATH*指定的项目会在下次提交删除,文件(和没有提交的目录)会立即从版本库删除,这个命令不会删除任何未版本化或已经修改的项目;使用--force选项可以覆盖这种行为方式。

URL指定的项目会在直接提交中从版本库删除,多个URL的提交是原子操作。

B、别名

del, remove, rm

C、选项

  • --force

  • --force-log

  • --message (-m) TEXT

  • --file (-F) FILE

  • --quiet (-q)

  • --targets FILENAME

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --editor-cmd EDITOR

  • --encoding ENC

  • --config-dir DIR

D、例子

使用svn从工作拷贝删除文件只是预定要删除,当你提交,文件才会从版本库删除。

$ svn delete myfile
D         myfile

$ svn commit -m "Deleted file 'myfile'."
Deleting       myfile
Transmitting file data .
Committed revision 14.

然而直接删除一个URL,你需要提供一个日志信息:

$ svn delete -m "Deleting file 'yourfile'" file:///tmp/repos/test/yourfile

Committed revision 15.

如下是强制删除本地已修改文件的例子:

$ svn delete over-there 
svn: Attempting restricted operation for modified resource
svn: Use --force to override this restriction
svn: 'over-there' has local modifications

$ svn delete --force over-there 
D         over-there

⑨、svn diff

A、描述

diff [-r N[:M]] [TARGET[@REV]...]

diff [-r N[:M]] --old OLD-TGT[@OLDREV] [--new NEW-TGT[@NEWREV]] [PATH...]

diff OLD-URL[@OLDREV] NEW-URL[@NEWREV]

显示两条路径的区别,svn diff有三种使用方式:

**svn diff [-r N[:M]] [--old OLD-TGT] [--new NEW-TGT] [PATH...]*会显示OLD-TGT和NEW-TGT的区别。如果给定路径PATH,它会被看作OLD-TGT和NEW-TGT的相对路径,输出也会限制在这些路径的区别上。OLD-TGT和NEW-TGT可以是工作拷贝路径或者是URL[@REV]。OLD-TGT缺省是当前工作目录,而NEW-TGT缺省是OLD-TGT。N缺省是BASE,M缺省时当前目录的版本,但如果NEW-TGT是一个URL,则默认是HEAD。svn diff -r N设置OLD-TGT的修订版本为N,svn diff -r N:M设置NEW-TGT的修订版本是M*。

svn diff [-r N[:M]] URL1[@N] URL2[@M]是svn diff [-r N[:M]] --old=URL1 --new=URL2的缩写。

*TARGET*是一个URL,然后可以使用前面提到的--revision或“@”符号来指定N和M。

如果*TARGET*是工作拷贝路径,则--revision选项的含义是:

--revision N:M

服务器比较 TARGET@N和TARGET@M。

--revision N

客户端比较*TARGET@N*和工作拷贝。

(无--revision)

客户端比较base和 TARGET的TARGET。

如果使用其他语法,服务器会比较*URL1和URL2各自的N和M。如果省掉N或M*,会假定为HEAD。

缺省情况下,svn diff忽略文件的祖先,只会比较两个文件的内容。如果你使用--notice-ancestry,比较修订版本(也就是,当你运行svn diff比较两个内容相同,但祖先历史不同的对象会看到所有的内容被删除又再次添加)时就会考虑路径的祖先。

B、别名

di

C、选项

  • --revision (-r) REV

  • --old OLD-TARGET

  • --new NEW-TARGET

  • --extensions (-x) "ARGS"

  • --non-recursive (-N)

  • --diff-cmd CMD

  • --notice-ancestry

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --no-diff-deleted

  • --config-dir DI

D、例子

比较BASE和你的工作拷贝(svn diff最经常的用法):

$ svn diff COMMITTERS 
Index: COMMITTERS
===================================================================
--- COMMITTERS	(revision 4404)
+++ COMMITTERS	(working copy)

察看你的工作拷贝对旧的修订版本的修改:

$ svn diff -r 3900 COMMITTERS 
Index: COMMITTERS
===================================================================
--- COMMITTERS	(revision 3900)
+++ COMMITTERS	(working copy)

使用“@”语法与修订版本3000和35000比较:

$ svn diff http://svn.collab.net/repos/svn/trunk/COMMITTERS@3000 \
http://svn.collab.net/repos/svn/trunk/COMMITTERS@3500
Index: COMMITTERS
===================================================================
--- COMMITTERS	(revision 3000)
+++ COMMITTERS	(revision 3500)
…

使用范围符号来比较修订版本3000和3500(在这种情况下只能传递一个URL):

$ svn diff -r 3000:3500 http://svn.collab.net/repos/svn/trunk/COMMITTERS
Index: COMMITTERS
===================================================================
--- COMMITTERS	(revision 3000)
+++ COMMITTERS	(revision 3500)

使用范围符号比较修订版本3000和3500trunk中的所有文件:

$ svn diff -r 3000:3500 http://svn.collab.net/repos/svn/trunk

使用范围符号比较修订版本3000和3500trunk中的三个文件:

$ svn diff -r 3000:3500 --old http://svn.collab.net/repos/svn/trunk COMMITTERS README HACKING

如果你有工作拷贝,你不必输入这么长的URL:

$ svn diff -r 3000:3500 COMMITTERS 
Index: COMMITTERS
===================================================================
--- COMMITTERS	(revision 3000)
+++ COMMITTERS	(revision 3500)

使用--diff-cmdCMD-x来指定外部区别程序

$ svn diff --diff-cmd /usr/bin/diff -x "-i -b" COMMITTERS 
Index: COMMITTERS
===================================================================
0a1,2
> This is a test
>

⑩、svn export

A、描述

svn export [-r REV] URL[@PEGREV] [PATH]

svn export PATH1[@PEGREV] PATH2

第一种从版本库导出干净工作目录树的形式是指定URL,如果指定了修订版本*REV,会导出相应的版本,如果没有指定修订版本,则会导出HEAD,导出到PATH。如果省略PATH,URL*的最后一部分会作为本地目录的名字。

从工作拷贝导出干净目录树的第二种形式是指定*PATH1到PATH2*,所有的本地修改将会保留,但是不再版本控制下的文件不会拷贝。

B、选项

  • --revision (-r) REV

  • --quiet (-q)

  • --force

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --config-dir DIR

  • --native-eol EO

C、例子

从你的工作拷贝导出(不会打印每一个文件和目录):

$ svn export a-wc my-export
Export complete.

从版本库导出目录(打印所有的文件和目录):

$ svn export file:///tmp/repos my-export
A  my-export/test
A  my-export/quiz
…
Exported revision 15.

当使用操作系统特定的分发版本,使用特定的EOL字符作为行结束符号导出一棵树会非常有用。--native-eol选项会这样做,但是如果影响的文件拥有svn:eol-style = native属性,举个例子,导出一棵使用CRLF作为行结束的树(可能是为了做一个Windows的.zip文件分发版本):

$ svn export file://tmp/repos my-export --native-eol CRLF
A  my-export/test
A  my-export/quiz
…
Exported revision 15.

⑪、svn help

A、描述

svn help [SUBCOMMAND...]

当手边没有这本书时,这是你使用Subversion最好的朋友!

B、别名

h

C、选项

  • --version

  • --quiet (-q)

⑫、svn import

A、描述

svn import [PATH] URL

递归提交一个路径的拷贝到URL。如果省略*PATH*,默认是“.”。版本库中对应的父目录必须已经创建。

B、选项

  • --message (-m) TEXT

  • --file (-F) FILE

  • --quiet (-q)

  • --non-recursive (-N)

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --force-log

  • --editor-cmd EDITOR

  • --encoding ENC

  • --config-dir DIR

  • --auto-props

  • --no-auto-props

C、例子

这会导入本地目录myproj到版本库的 根目录:

$ svn import -m "New import" myproj http://svn.red-bean.com/repos/test
Adding         myproj/sample.txt
…
Transmitting file data .........
Committed revision 16.

这将本地目录myproj导入到版本库的trunk/misc,trunk/misc在导入之前不需要存在―svn import会递归的为你创建目录:

$ svn import -m "New import" myproj \
    http://svn.red-bean.com/repos/test/trunk/misc/myproj
Adding         myproj/sample.txt
…
Transmitting file data .........
Committed revision 19.

在导入数据之后,你会发现原先的目录树并没有纳入版本控制,为了开始工作,你还是要运行svn checkout得到一个干净的目录树工作拷贝。

⑬、svn info

A、描述

svn info [PATH...]

打印PATH的信息

B、选项

  • --targets FILENAME

  • --recursive (-R)

  • --config-dir DIR

C、例子

svn info会展示所有项目的所有有用信息,它会显示文件的信息:

$ svn info foo.c
Path: foo.c
Name: foo.c
URL: http://svn.red-bean.com/repos/test/foo.c
Revision: 4417
Node Kind: file
Schedule: normal
Last Changed Author: sally
Last Changed Rev: 20
Last Changed Date: 2003-01-13 16:43:13 -0600 (Mon, 13 Jan 2003)
Text Last Updated: 2003-01-16 21:18:16 -0600 (Thu, 16 Jan 2003)
Properties Last Updated: 2003-01-13 21:50:19 -0600 (Mon, 13 Jan 2003)
Checksum: /3L38YwzhT93BWvgpdF6Zw==

它也会展示目录的信息:

$ svn info vendors
Path: trunk
URL: http://svn.red-bean.com/repos/test/vendors
Revision: 19
Node Kind: directory
Schedule: normal
Last Changed Author: harry
Last Changed Rev: 19
Last Changed Date: 2003-01-16 23:21:19 -0600 (Thu, 16 Jan 2003)

⑭、svn list

A、描述

svn list [TARGET[@REV]...]

列出每一个*TARGET文件和TARGET目录的内容,如果TARGET*是工作拷贝路径,会使用对应的版本库URL。缺省的*TARGET*是“.”,意味着当前工作拷贝的版本库URL。

B、别名

ls

C、选项

  • --revision (-r) REV

  • --verbose (-v)

  • --recursive (-R)

  • --incremental

  • --xml

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --config-dir DI

D、例子

如果你希望在没有下载工作拷贝时察看版本库有哪些文件,svn list会非常有用:

$ svn list http://svn.red-bean.com/repos/test/support
README.txt
INSTALL
examples/
…

你也可以传递--verbose选项来得到额外信息,非常类似UNIX的ls -l命令:

$ svn list --verbose file:///tmp/repos
     16 sally         28361 Jan 16 23:18 README.txt
     27 sally             0 Jan 18 15:27 INSTALL
     24 harry               Jan 18 11:27 examples/

⑮、svn log

A、描述

svn log [PATH]

svn log URL [PATH...]

显示提交日志信息:

缺省目标是你的当前目录的路径,如果没有提供参数,svn log会显示当前目录下的所有文件和目录的日志信息,你可以通过指定路径来精炼结果,一个或多个修订版本,或者是任何两个的组合。对于本地路径的缺省修订版本范围BASE:1。

如果你只是指定一个URL,就会打印这个URL上所有的日志信息,如果添加部分路径,只有这条路径下的URL信息会被打印,URL缺省的修订版本范围是HEAD:1。

svn log使用--verbose选项也会打印所有影响路径的日志信息,使用--quiet选项不会打印日志信息正文本身(这与--verbose协调一致)。

每个日志信息只会打印一次,即使是那些明确请求不止一次的路径,日志会跟随在拷贝过程中,使用--stop-on-copy可以关闭这个特性,可以用来监测分支点。

B、选项

  • --revision (-r) REV

  • --quiet (-q)

  • --verbose (-v)

  • --targets FILENAME

  • --stop-on-copy

  • --incremental

  • --xml

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --config-dir DIR

C、例子

你可以在顶级目录运行svn log看到工作拷贝中所有修改的路径的日志信息:

$ svn log
------------------------------------------------------------------------
r20 | harry | 2003-01-17 22:56:19 -0600 (Fri, 17 Jan 2003) | 1 line
Tweak.
------------------------------------------------------------------------
r17 | sally | 2003-01-16 23:21:19 -0600 (Thu, 16 Jan 2003) | 2 lines
…

检验一个特定文件所有的日志信息:

$ svn log foo.c
------------------------------------------------------------------------
r32 | sally | 2003-01-13 00:43:13 -0600 (Mon, 13 Jan 2003) | 1 line
Added defines.
------------------------------------------------------------------------
r28 | sally | 2003-01-07 21:48:33 -0600 (Tue, 07 Jan 2003) | 3 lines
…

如果你手边没有工作拷贝,你可以查看一个URL的日志:

$ svn log http://svn.red-bean.com/repos/test/foo.c
------------------------------------------------------------------------
r32 | sally | 2003-01-13 00:43:13 -0600 (Mon, 13 Jan 2003) | 1 line
Added defines.
------------------------------------------------------------------------
r28 | sally | 2003-01-07 21:48:33 -0600 (Tue, 07 Jan 2003) | 3 lines
…

如果你希望查看某个URL下面不同的多个路径,你可以使用URL [PATH...]语法。

$ svn log http://svn.red-bean.com/repos/test/ foo.c bar.c
------------------------------------------------------------------------
r32 | sally | 2003-01-13 00:43:13 -0600 (Mon, 13 Jan 2003) | 1 line
Added defines.
------------------------------------------------------------------------
r31 | harry | 2003-01-10 12:25:08 -0600 (Fri, 10 Jan 2003) | 1 line
Added new file bar.c
------------------------------------------------------------------------
r28 | sally | 2003-01-07 21:48:33 -0600 (Tue, 07 Jan 2003) | 3 lines
…

当你想连接多个队日志命令的调用结果,你会希望使用--incremental选项。svn log通常会在日志信息的开头和每一小段间打印一行虚线,如果你对一段修订版本运行svn log,你会得到下面的结果:

$ svn log -r 14:15
------------------------------------------------------------------------
r14 | ... 
------------------------------------------------------------------------
r15 | ... 
------------------------------------------------------------------------

然而,如果你希望收集两个不连续的日志信息到一个文件,你会这样做:

$ svn log -r 14 > mylog
$ svn log -r 19 >> mylog
$ svn log -r 27 >> mylog
$ cat mylog
------------------------------------------------------------------------
r14 | ... 
------------------------------------------------------------------------
------------------------------------------------------------------------
r19 | ... 
------------------------------------------------------------------------
------------------------------------------------------------------------
r27 | ... 
------------------------------------------------------------------------

你可以使用incremental选项来避免两行虚线带来的混乱:

$ svn log --incremental -r 14 > mylog
$ svn log --incremental -r 19 >> mylog
$ svn log --incremental -r 27 >> mylog
$ cat mylog
------------------------------------------------------------------------
r14 | ... 
------------------------------------------------------------------------
r19 | ... 
------------------------------------------------------------------------
r27 | ...

--incremental选项为--xml提供了一个相似的输出控制。

提示

如果你在特定路径和修订版本运行svn log,输出结果为空

$ svn log -r 20 http://svn.red-bean.com/untouched.txt
------------------------------------------------------------------------

这只意味着这条路径在那个修订版本没有修改,如果从版本库的顶级目录运行这个命令,或者是你知道那个修订版本修改了那个文件,你可以明确的指定它:

$ svn log -r 20 touched.txt 
------------------------------------------------------------------------
r20 | sally | 2003-01-17 22:56:19 -0600 (Fri, 17 Jan 2003) | 1 line
Made a change.
------------------------------------------------------------------------

⑯、svn merge

A、描述

svn merge sourceURL1[@N] sourceURL2[@M] [WCPATH]
svn merge sourceWCPATH1@N sourceWCPATH2@M [WCPATH]
svn merge -r N:M SOURCE[@REV] [WCPATH]

第一种形式,源URL用修订版本号*N和M*指定,这是要比较的两组源文件,如果省略修订版本号,缺省是HEAD。

第二种形式,*SOURCE可以是URL或者工作拷贝项目,与之对应的URL会被使用。在修订版本号N和M*的URL定义了要比较的两组源。

WCPATH是接收变化的工作拷贝路径,如果省略WCPATH,会假定缺省值“.”,除非源有相同基本名称与“.”中的某一文件名字匹配:在这种情况下,区别会应用到那个文件。

不像svn diff,合并操作在执行时会考虑文件的祖先,当你从一个分支合并到另一个分支,而这两个分支有各自重命名的文件时,这一点会非常重要。

B、选项

  • --revision (-r) REV

  • --non-recursive (-N)

  • --quiet (-q)

  • --force

  • --dry-run

  • --diff3-cmd CMD

  • --ignore-ancestry

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --config-dir DIR

C、例子

将一个分支合并回主干(假定你有一份主干的工作拷贝,分支在修订版本250创建):

$ svn merge -r 250:HEAD http://svn.red-bean.com/repos/branches/my-branch
U  myproj/tiny.txt
U  myproj/thhgttg.txt
U  myproj/win.txt
U  myproj/flo.txt

如果你的分支在修订版本23,你希望将主干的修改合并到分支,你可以在你的工作拷贝的分支上这样做:

$ svn merge -r 23:30 file:///tmp/repos/trunk/vendors
U  myproj/thhgttg.txt
…

合并一个单独文件的修改:

$ cd myproj
$ svn merge -r 30:31 thhgttg.txt 
U  thhgttg.txt

17、svn mkdir

A、描述

svn mkdir PATH...
svn mkdir URL...

创建一个目录,名字是提供的*PATH或者URL的最后一部分,工作拷贝PATH*指定的目录会预定要添加,而通过URL指定的目录会作为一次立即提交在版本库建立。多个目录URL的提交是原子操作,在两种情况下,中介目录必须已经存在。

B、选项

  • --message (-m) TEXT

  • --file (-F) FILE

  • --quiet (-q)

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --editor-cmd EDITOR

  • --encoding ENC

  • --force-log

  • --config-dir DIR

C、例子

在工作拷贝创建一个目录:

$ svn mkdir newdir
A         newdir

在版本库创建一个目录(立即提交,所以需要日志信息):

$ svn mkdir -m "Making a new dir." http://svn.red-bean.com/repos/newdir
Committed revision 26.

18、svn move

A、描述

svn move SRC DST

这个命令移动文件或目录到你的工作拷贝或者是版本库。这个命令同svn copy加一个svn delete等同。

Subversion不支持在工作拷贝和URL之间拷贝,此外,你只可以一个版本库内移动文件―Subversion不支持跨版本库的移动。

WC -> WC

移动和预订一个文件或目录将要添加(包含历史)。

URL -> URL

完全服务器端的重命名。

B、别名

mv, rename, ren

C、选项

  • --message (-m) TEXT

  • --file (-F) FILE

  • --revision (-r) REV

  • --quiet (-q)

  • --force

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --editor-cmd EDITOR

  • --encoding ENC

  • --force-log

  • --config-dir DIR

D、例子

移动工作拷bede一个文件:

$ svn move foo.c bar.c
A         bar.c
D         foo.c

移动版本库中的一个文件(一个立即提交,所以需要提交信息):

$ svn move -m "Move a file" http://svn.red-bean.com/repos/foo.c \
                   http://svn.red-bean.com/repos/bar.c
Committed revision 27.

19、svn propdel

A、描述

svn move SRC DST

删除一个项目的一个属性。这会删除文件、目录或修订版本的属性。第一种形式是在工作拷贝删除版本化属性,第二种是在一个版本库修订版本中删除未版本化的属性。

B、别名

pdel, pd

C、选项

  • --quiet (-q)

  • --recursive (-R)

  • --revision (-r) REV

  • --revprop

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --config-dir DIR

D、例子

删除你的工作拷贝中一个文件的一个属性

$ svn propdel svn:mime-type  some-script
property 'svn:mime-type' deleted from 'some-script'.

删除一个修订版本的属性:

$ svn propdel --revprop -r 26 release-date 
property 'release-date' deleted from repository revision '26'

20、svn propedit

A、描述

svn propedit PROPNAME PATH...
svn propedit PROPNAME --revprop -r REV [URL]

修改一个或多个版本控制之下文件的属性。使用喜欢的编辑器编辑一个或多个属性,第一种形式是在工作拷贝编辑版本化的属性,第二种形式是远程编辑未版本化的版本库修订版本属性。

B、别名

pedit, pe

C、选项

  • --revision (-r) REV

  • --revprop

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --encoding ENC

  • --editor-cmd EDITOR

  • --config-dir DIR

D、例子

svn propedit对修改多个值的属性非常简单:

$ svn propedit svn:keywords  foo.c 
    <svn will launch your favorite editor here, with a buffer open
    containing the current contents of the svn:keywords property.  You
    can add multiple values to a property easily here by entering one
    value per line.>
Set new value for property 'svn:keywords' on 'foo.c'

21、svn propget

A、描述

svn propget PROPNAME [TARGET[@REV]...]
svn propget PROPNAME --revprop -r REV [URL]

打印一个属性的值。打印一个文件、目录或修订版本的一个属性的值,第一种形式是打印工作拷贝中一个或多个项目的版本化的属性,第二种形式是远程打印版本库修订版本的未版本化的属性。

B、别名

pget, pg

C、选项

  • --recursive (-R)

  • --revision (-r) REV

  • --revprop

  • --strict

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --config-dir DIR

D、例子

检查工作拷贝的一个文件的一个属性:

$ svn propget svn:keywords foo.c
Author
Date
Rev

对于修订版本属性相同:

$ svn propget svn:log --revprop -r 20 
Began journal.

22、svn proplist

A、描述

svn proplist [TARGET[@REV]...]
svn proplist --revprop -r REV [URL]

列出所有的属性。列出文件、目录或修订版本的属性,第一种形式是列出工作拷贝的所有版本化的属性,第二种形式是列出版本库修订版本的未版本化的属性。

B、别名

plist, pl

C、选项

  • --verbose (-v)

  • --recursive (-R)

  • --revision (-r) REV

  • --quiet (-q)

  • --revprop

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --config-dir DIR

D、例子

你可以使用proplist察看你的工作拷贝的一个项目的属性:

$ svn proplist foo.c
Properties on 'foo.c':
  svn:mime-type
  svn:keywords
  owner

通过--verbose选项,svn proplist也可以非常便利的显示属性的值:

$ svn proplist --verbose foo.c
Properties on 'foo.c':
  svn:mime-type : text/plain
  svn:keywords : Author Date Rev
  owner : sally

23、svn propset

A、描述

svn propset PROPNAME [PROPVAL | -F VALFILE] PATH...
svn propset PROPNAME --revprop -r REV [PROPVAL | -F VALFILE] [URL]

设置文件、目录或者修订版本的属性*PROPNAME为PROPVAL*。第一个例子在工作拷贝创建了一个版本化的本地属性修改,第二个例子创建了一个未版本化的远程的对版本库修订版本的属性修改。

B、别名

pset, ps

C、选项

  • --file (-F) FILE

  • --quiet (-q)

  • --revision (-r) REV

  • --targets FILENAME

  • --recursive (-R)

  • --revprop

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --encoding ENC

  • --force

  • --config-dir DIR

D、例子

设置文件的mimetype:

$ svn propset svn:mime-type image/jpeg foo.jpg 
property 'svn:mime-type' set on 'foo.jpg'

在UNIX系统,如果你希望一个文件设置执行权限:

$ svn propset svn:executable ON somescript
property 'svn:executable' set on 'somescript'

或许为了合作者的利益你有一个内部的属性设置:

$ svn propset owner sally foo.c
property 'owner' set on 'foo.c'

如果你在特定修订版本的日志信息里有一些错误,并且希望修改,可以使用--revprop设置svn:log为新的日志信息:

$ svn propset --revprop -r 25 svn:log "Journaled about trip to New York."
property 'svn:log' set on repository revision '25'

或者,你没有工作拷贝,你可以提供一个URL。

$ svn propset --revprop -r 26 svn:log "Document nap." http://svn.red-bean.com/repos
property 'svn:log' set on repository revision '25'

最后,你可以告诉propset从一个文件得到输入,你甚至可以使用这个方式来设置一个属性为二进制内容:

$ svn propset owner-pic -F sally.jpg moo.c 
property 'owner-pic' set on 'moo.c'

24、svn resolved

A、描述

svn resolved PATH...

删除工作拷贝文件或目录的“conflicted”状态。这个程序不是语义上的改变冲突标志,它只是删除冲突相关的人造文件,从而重新允许路径提交;也就是说,它告诉Subversion冲突已经“解决了”。

B、别名

C、选项

  • --targets FILENAME

  • --recursive (-R)

  • --quiet (-q)

  • --config-dir DIR

D、例子

如果你在更新时得到冲突,你的工作拷贝会产生三个新的文件:

$ 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除了删除冲突文件,还修正了一些记录在工作拷贝管理区域的记录数据,所以我们推荐你使用这个命令。

25、svn revert

A、描述

svn revert PATH...

取消所有的本地编辑。恢复所有对文件和目录的修改,并且解决所有的冲突状态。svn revert不会只是恢复工作拷贝中一个项目的内容,也包括了对属性修改的恢复。最终,你可以使用它来取消所有已经做过的预定操作(例如,文件预定要添加或删除可以“恢复”)。

B、别名

C、选项

  • --targets FILENAME

  • --recursive (-R)

  • --quiet (-q)

  • --config-dir DIR

D、例子

丢弃对一个文件的修改:

$ svn revert foo.c
Reverted foo.c

如果你希望恢复一整个目录的文件,可以使用--recursive选项:

$ svn revert --recursive .
Reverted newdir/afile
Reverted foo.c
Reverted bar.txt

最后,你可以取消预定的操作:

$ svn add mistake.txt whoops
A         mistake.txt
A         whoops
A         whoops/oopsie.c

$ svn revert mistake.txt whoops
Reverted mistake.txt
Reverted whoops

$ svn status
      mistake.txt
      whoops

注意:如果你没有给svn revert提供了目标,它不会做任何事情―为了保护你不小心失去对工作拷贝的修改,svn revert需要你提供至少一个目标。

26、svn status

A、描述

svn status [PATH...]

打印工作拷贝文件和目录的状态。

打印工作拷贝文件和目录的状态。如果没有参数,只会打印本地修改的项目(不会访问版本库),使用--show-updates选项,会添加工作修订版本和服务器过期信息。使用--verbose会打印每个项目的完全修订版本信息。

输出的前五列都是一个字符宽,每一列给出了工作拷贝项目的每一方面的信息。

第一列指出一个项目的是添加、删除还是其它的修改。

  • ' ':没有修改。

  • 'A':预定要添加的项目。

  • 'D':预定要删除的项目。

  • 'M':项目已经修改了。

  • 'R':项目在工作拷贝中已经被替换了。

  • 'C':项目与从版本库的更新冲突。

  • 'X':项目与外部定义相关。

  • 'I':项目被忽略(例如使用svn:ignore属性)。

  • '':项目不在版本控制之下。

  • '!':项目已经丢失(例如,你使用svn移动或者删除了它)。这也说明了一个目录不是完整的(一个检出或更新中断)。

  • '~':项目作为一种对象(文件、目录或链接)纳入版本控制,但是已经被另一种对象替代。

第二列告诉一个文件或目录的属性的状态。

  • ' ':没有修改。

  • 'M':这个项目的属性已经修改。

  • 'C':这个项目的属性与从版本库得到的更新有冲突。

第三列只在工作拷贝锁定时才会出现。

  • ' ':项目没有锁定。

  • 'L':项目已经锁定。

第四列只在预定包含历史添加的项目出现。

  • ' ':没有历史预定要提交。

  • '+':历史预定要伴随提交。

第五列只在项目跳转到相对于它的父目录时出现(见[“转换工作拷贝”一节])。

  • ' ':项目是它的父目录的孩子。

  • 'S':项目已经转换。

过期信息出现在第八列(只在使用--show-updates选项时出现)。

  • ' ':这个项目在工作拷贝是最新的。

  • '*':在服务器这个项目有了新的修订版本。

余下的字段是可变得宽度且使用空格分隔,如果使用--show-updates或--verbose选项,工作修订版本是下一个字段。

如果传递--verbose选项,最后提交的修订版本和最后的提交作者会在后面显示。

工作拷贝路径永远是最后一个字段,所以它可以包括空格。

B、别名

stat, st

C、选项

  • --show-updates (-u)

  • --verbose (-v)

  • --non-recursive (-N)

  • --quiet (-q)

  • --no-ignore

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --config-dir

D、例子

这是查看你在工作拷贝所做的修改的最简单的方法。

$ svn status wc
 M     wc/bar.c
A  +   wc/qax.c

如果你希望找出工作拷贝哪些文件是最新的,使用--show-updates选项(这不会对工作拷贝有任何修改)。这里你会看到wc/foo.c在上次更新后有了修改:

$ svn status --show-updates wc
 M           965    wc/bar.c
       *     965    wc/foo.c
A  +         965    wc/qax.c
Status against revision:    981

注意:--show-updates只会在过期的项目(如果你运行svn update,就会更新的项目)旁边安置一个星号。--show-updates不会导致状态列表反映项目的版本库版本。

最后,是你能从status子命令得到的所有信息:

$ svn status --show-updates --verbose wc
 M           965       938 sally        wc/bar.c
       *     965       922 harry        wc/foo.c
A  +         965       687 harry        wc/qax.c
             965       687 harry        wc/zig.c
Head revision:   981

27、svn switch

A、描述

svn switch URL [PATH]
switch --relocate FROM TO [PATH...]

把工作拷贝更新到别的URL。这个子命令更新你的工作拷贝来反映新的URL―通常是一个与你的工作拷贝分享共同祖先的URL,尽管这不是必需的。这是Subversion移动工作拷贝到分支的方式。

B、别名

sw

C、选项

  • --revision (-r) REV

  • --non-recursive (-N)

  • --quiet (-q)

  • --diff3-cmd CMD

  • --relocate

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --config-dir DIR

D、例子

如果你目前所在目录vendors分支到vendors-with-fix,你希望转移到那个分支:

$ svn switch http://svn.red-bean.com/repos/branches/vendors-with-fix .
U  myproj/foo.txt
U  myproj/bar.txt
U  myproj/baz.c
U  myproj/qux.c
Updated to revision 31.

为了跳转回来,只需要提供最初取出工作拷贝的版本库URL:

$ svn switch http://svn.red-bean.com/repos/trunk/vendors .
U  myproj/foo.txt
U  myproj/bar.txt
U  myproj/baz.c
U  myproj/qux.c
Updated to revision 31.

提示:如果你不希望跳转所有的工作拷贝,你可以只跳转一部分。

有时候管理员会修改版本库的“基本位置”―换句话说,版本库的内容并不改变,但是访问根的主URL变了。举个例子,主机名变了、URL模式变了或者是URL中的任何一部分改变了。我们不选择重新检出一个工作拷贝,你可以使用svn switch来重写版本库所有URL的开头。使用--relocate来做这种替换,没有文件内容会改变,访问的版本库也不会改变。只是像在工作拷贝.svn/运行了一段Perl脚本s/OldRoot/NewRoot/。

$ svn checkout file:///tmp/repos test
A  test/a
A  test/b
…

$ mv repos newlocation
$ cd test/

$ svn update
svn: Unable to open an ra_local session to URL
svn: Unable to open repository ' 

$ svn switch --relocate file:///tmp/repos file:///tmp/newlocation .
$ svn update
At revision 3.

警告:小心使用--relocate选项,如果你输入了错误的选项,你会在工作拷贝创建无意义的URL,会导致整个工作区不可用并且难于修复。理解何时应该使用--relocate也是非常重要的,下面是一些规则:

  • 如果工作拷贝需要反映一个版本库的新目录,只需要使用svn switch。

  • 如果你的工作拷贝还是反映相同的版本库目录,但是版本库本身的位置改变了,使用svn switch --relocate。

28、svn update

A、描述

svn update [PATH...]

svn update会把版本库的修改带到工作拷贝,如果没有给定修订版本,它会把你的工作拷贝更新到HEAD修订版本,否则,它会把工作拷贝更新到你用--revision指定的修订版本。

对于每一个更新的项目开头都有一个表示所做动作的字符,这些字符有下面的意思:

A:添加、D:删除、U:更新、C:冲突、G:合并

第一列的字符反映文件本身的更新,而第二列会反映文件属性的更新。

B、别名

up

C、选项

  • --revision (-r) REV

  • --non-recursive (-N)

  • --quiet (-q)

  • --diff3-cmd CMD

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --config-dir DIR

D、例子

获取你上次更新之后版本库的修改:

$ svn update
A  newdir/toggle.c
A  newdir/disclose.c
A  newdir/launch.c
D  newdir/README
Updated to revision 32.

你也可以将工作拷贝更新到旧的修订版本(Subversion没有CVS的“sticky”文件的概念;见[附录A, Subversion对于CVS用户]):

$ svn update -r30
A  newdir/README
D  newdir/toggle.c
D  newdir/disclose.c
D  newdir/launch.c
U  foo.c
Updated to revision 30.

提示:如果你希望检查单个文件的旧的修订版本,你会希望使用svn cat。

2.2、svnadmin

①、svnadmin create

A、描述

svnadmin create REPOS_PATH

创建一个新的空的版本库。在提供的路径上创建一个新的空的版本库,如果提供的目录不存在,它会为你创建。

B、选项

  • --bdb-txn-nosync

  • --bdb-log-keep

  • --config-dir DIR

  • --fs-type TYPE

C、例子

创建一个版本库就是这样简单:

$ svnadmin create /usr/local/svn/repos

在Subversion 1.0,一定会创建一个Berkeley DB版本库,在Subversion 1.1,Berkeley DB版本库是缺省类型,但是一个FSFS版本库也是可以创建,使用--fs-type选项:

$ svnadmin create /usr/local/svn/repos --fs-type fsfs

记住svnadmin只工作在本地路径,而不是URL。

②、svnadmin deltify

A、描述

svnadmin deltify [-r LOWER[:UPPER]] REPOS_PATH

修订版本范围的路径的增量变化。

svnadmin deltify因为历史原因之存在于1.0.x,这个命令已经废弃,不再需要。

它开始于当Subversion提供了管理员控制版本库压缩策略的能力,结果是复杂工作得到了非常小的收益,所以这个“特性”被废弃了。

B、选项

  • --revision (-r)

  • --quiet

③、svnadmin dump

A、描述

svnadmin dump REPOS_PATH [-r LOWER[:UPPER]] [--incremental]

将文件系统的内容转储到标准输出。

使用“dumpfile”可移植格式将文件系统的内容转储到标准输出,将反馈发送到标准错误,导出的修订版本从*LOWER到UPPER。如果没有提供修订版本,会导出所有的修订版本树,如果只提供LOWER*,导出一个修订版本树。

如果Subversion的转储文件很大,你可以使用--deltas来减小svnadmin创建的导出文件的大小。通过这个选项,就不会写出每次修订版本的内容,svnadmin dump只会写出版本之间的区别。然而,创建增量导出文件的坏处―对CPU的要求更高,svndumpfilter不可以对这个文件操作,而且非增量的转储文件可以更好的压缩。

B、选项

  • --revision (-r)

  • --incremental

  • --quiet

  • --deltas

C、例子

转储整个版本库:

$ svnadmin dump /usr/local/svn/repos
SVN-fs-dump-format-version: 1
Revision-number: 0
* Dumped revision 0.
Prop-content-length: 56
Content-length: 56
…

从版本库增量转储一个单独的事务:

$ svnadmin dump /usr/local/svn/repos -r 21 --incremental 
* Dumped revision 21.
SVN-fs-dump-format-version: 1
Revision-number: 21
Prop-content-length: 101
Content-length: 101
…

④、svnadmin help

A、描述

svnadmin help [SUBCOMMAND...]

当你困于一个没有网络连接和本书的沙漠岛屿时,这个子命令非常有用。

B、别名

, h

⑤、svnadmin hotcopy

A、描述

svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH

制作一个版本库的热备份。

这个子命令会制作一个版本库的完全“热”拷贝,包括所有的钩子,配置文件,当然还有数据库文件。如果你传递--clean-logs选项,svnadmin会执行热拷贝操作,然后删除不用的Berkeley DB日志文件。你可以在任何时候运行这个命令得到一个版本库的安全拷贝,不管其它进程是否使用这个版本库。

B、选项

  • --clean-logs

⑥、svnadmin list-dblogs

A、描述

svnadmin list-dblogs REPOS_PATH

询问Berkeley DB在给定的Subversion版本库有哪些日志文件存在(只有在版本库使用bdb作为后端时使用)。

Berkeley DB创建了记录所有版本库修改的日志,允许我们在面对大灾难时恢复。除非你开启了DB_LOGS_AUTOREMOVE,否则日志文件会累积,尽管大多数是不再使用可以从磁盘删除得到空间。

⑦、svnadmin list-unused-dblogs

A、描述

svnadmin list-unused-dblogs REPOS_PATH

询问Berkeley DB哪些日志文件可以安全的删除(只有在版本库使用bdb作为后端时使用)。

Berkeley DB创建了记录所有版本库修改的日志,允许我们在面对大灾难时恢复。除非你开启了DB_LOGS_AUTOREMOVE,否则日志文件会累积,尽管大多数是不再使用,可以从磁盘删除得到空间。

B、例子

删除所有不用的日志文件:

$ svnadmin list-unused-dblogs /path/to/repos
/path/to/repos/log.0000000031
/path/to/repos/log.0000000032
/path/to/repos/log.0000000033

$ svnadmin list-unused-dblogs /path/to/repos | xargs rm
## disk space reclaimed!

⑧、svnadmin load

A、描述

svnadmin load REPOS_PATH

从标准输出读取“转储文件”格式流,提交新的修订版本到版本库文件系统,发送进展反馈到标准输出。

B、选项

  • --quiet (-q)

  • --ignore-uuid

  • --force-uuid

  • --parent-dir

C、例子

这里显示了加载一个备份文件到版本库(当然,使用svnadmin dump):

$ svnadmin load /usr/local/svn/restored < repos-backup
<<< Started new txn, based on original revision 1
     * adding path : test ... done.
     * adding path : test/a ... done.
…

或者你希望加载到一个子目录:

$ svnadmin load --parent-dir new/subdir/for/project /usr/local/svn/restored < repos-backup
<<< Started new txn, based on original revision 1
     * adding path : test ... done.
     * adding path : test/a ... done.
…

⑨、svnadmin lstxns

A、描述

svnadmin lstxns REPOS_PATH

打印所有未提交的事物名称。

B、例子

列出版本库所有突出的事物。
$ svnadmin lstxns /usr/local/svn/repos/ 
1w
1x

⑩、svnadmin recover

A、描述

svnadmin recover REPOS_PATH

将版本库数据库恢复到稳定状态(只有在版本库使用bdb作为后端时使用)。在你得到的错误说明你需要恢复版本库时运行这个命令。

B、选项


  • --wait


C、例子

恢复挂起的版本库:

$ svnadmin recover /usr/local/svn/repos/ 
Repository lock acquired.
Please wait; recovering the repository may take some time...

Recovery completed.
The latest repos revision is 34.

恢复数据库需要一个版本库的独占锁,如果另一个进程访问版本库,svnadmin recover会出错:

$ svnadmin recover /usr/local/svn/repos
svn: Failed to get exclusive repository access; perhaps another process
such as httpd, svnserve or svn has it open

--wait选项可以导致svnadmin recover一直等待其它进程断开连接:

$ svnadmin recover /usr/local/svn/repos --wait
Waiting on repository lock; perhaps another process has it open

### time goes by...

Repository lock acquired.
Please wait; recovering the repository may take some time...

Recovery completed.
The latest repos revision is 34.

⑪、svnadmin rmtxns

A、描述

svnadmin rmtxns REPOS_PATH TXN_NAME...

从版本库删除事物。

B、选项

  • --quiet (-q)

C、例子

删除命名的事物:

$ svnadmin rmtxns /usr/local/svn/repos/ 1w 1x

很幸运,lstxns的输出作为rmtxns输入工作良好:

$ svnadmin rmtxns /usr/local/svn/repos/  `svnadmin lstxns /usr/local/svn/repos/`

从版本库删除所有未提交的事务。

⑫、svnadmin setlog

A、描述

svnadmin setlog REPOS_PATH -r REVISION FILE

设置修订版本REVISION的日志信息为FILE的内容。

这与使用svn propset --revprop设置某一修订版本的svn:log属性效果一样,除了你也可以使用--bypass-hooks选项绕过的所有pre-或post-commit的钩子脚本,这在pre-revprop-change钩子脚本中禁止修改修订版本属性时非常有用。

警告:修订版本属性不在版本控制之下的,所以这个命令会永久覆盖前一个日志信息。

B、选项

  • --revision (-r) ARG

  • --bypass-hooks

C、例子

设置修订版本19的日志信息为文件msg的内容:

$ svnadmin setlog /usr/local/svn/repos/ -r 19 msg

⑬、svnadmin verify

A、描述

svnadmin verify REPOS_PATH

验证版本库保存的数据。如果希望验证版本库的完整性可以运行这个命令,原理是通过在内部转储遍历所有的修订版本并且丢掉输出。

B、例子

检验挂起的版本库:

$ svnadmin verify /usr/local/svn/repos/ 
* Verified revision 1729.

2.3、svnlook

①、svnlook

A、描述

svnadmin setlog REPOS_PATH -r REVISION FILE

svnlook是检验Subversion版本库不同方面的命令行工具,它不会对版本库有任何修改―它只是用来“看”。svnlook通常被版本库钩子使用,但是版本库管理也会发现它在诊断目的上也非常有用。

因为svnlook通过直接版本库访问(因此只可以在保存版本库的机器上工作)工作,所以他通过版本库的路径访问,而不是URL。

如果没有指定修订版本或事物,svnlook缺省的是版本库最年轻的(最新的)修订版本。

B、选项

svnlook的选项是全局的,就像svn和svnadmin;然而,大多数选项只会应用到一个子命令,因为svnlook的功能是(有意的)限制在一定范围的。

  • --no-diff-deleted:防止svnlook打印删除文件的区别,缺省的行为方式是当一个文件在一次事物/修订版本中删除后,得到的结果与保留这个文件的内容变成空相同。

  • --revision (-r):指定要进行检查的特定修订版本。

  • --transaction (-t):指定一个希望检查的特定事物ID。

  • --show-ids:显示文件系统树中每条路径的文件系统节点修订版本ID。

②、svnlook author

A、描述

svnlook author REPOS_PATH

打印版本库一个修订版本或者事物的作者。

B、选项

  • --revision (-r)

  • --transaction (-t)

C、例子

svnlook author垂手可得,但是并不令人激动:

$ svnlook author -r 40 /usr/local/svn/repos 
sally

③、svnlook cat

A、描述

svnlook cat REPOS_PATH PATH_IN_REPOS

打印一个文件的内容。

B、选项

  • --revision (-r)

  • --transaction (-t)

C、例子

这会显示事物ax8中一个文件的内容,位于/trunk/README:

$ svnlook cat -t ax8 /usr/local/svn/repos /trunk/README
               Subversion, a version control system.
               =====================================
$LastChangedDate: 2003-07-17 10:45:25 -0500 (Thu, 17 Jul 2003) $
Contents:
     I. A FEW POINTERS
    II. DOCUMENTATION
   III. PARTICIPATING IN THE SUBVERSION COMMUNITY
…

④、svnlook changed

A、描述

svnlook changed REPOS_PATH

打印在特定修订版本或事物修改的路径,也是在第一列使用“svn update样式的”状态字符:A表示添加,D表示删除,U表示更新(修改)。

B、选项

  • --revision (-r)

  • --transaction (-t)

C、例子

显示在测试版本库修订版本39修改的文件列表:

$ svnlook changed -r 39 /usr/local/svn/repos
A   trunk/vendors/deli/
A   trunk/vendors/deli/chips.txt
A   trunk/vendors/deli/sandwich.txt
A   trunk/vendors/deli/pickle.txt

⑤、svnlook date

A、描述

svnlook date REPOS_PATH

打印版本库一个修订版本或事物的时间戳。

B、选项

  • --revision (-r)

  • --transaction (-t)

C、例子

显示测试版本库修订版本40的日期:

$ svnlook date -r 40 /tmp/repos/
2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003)

⑥、svnlook diff

A、描述

svnlook diff REPOS_PATH

打印版本库中GNU样式的文件和属性修改区别。

B、选项

  • --revision (-r)

  • --transaction (-t)

  • --no-diff-deleted

C、例子

这显示了一个新添加的(空的)文件,一个删除的文件和一个拷贝的文件:

$ svnlook diff -r 40 /usr/local/svn/repos/
Copied: egg.txt (from rev 39, trunk/vendors/deli/pickle.txt)
Added: trunk/vendors/deli/soda.txt
==============================================================================
Modified: trunk/vendors/deli/sandwich.txt
==============================================================================
--- trunk/vendors/deli/sandwich.txt(original)
+++ trunk/vendors/deli/sandwich.txt2003-02-22 17:45:04.000000000 -0600
@@ -0,0 +1 @@
+Don't forget the mayo!
Modified: trunk/vendors/deli/logo.jpg
==============================================================================
(Binary files differ)
Deleted: trunk/vendors/deli/chips.txt
==============================================================================
Deleted: trunk/vendors/deli/pickle.txt
==============================================================================

如果一个文件有非文本的svn:mime-type属性,区别不会明确显示。

⑦、svnlook dirs-changed

A、描述

svnlook dirs-changed REPOS_PATH

打印本身修改(属性编辑)或子文件修改的目录。

B、选项

  • --revision (-r)

  • --transaction (-t)

C、例子

这显示了在我们的实例版本库中在修订版本40修改的目录:

$ svnlook dirs-changed -r 40 /usr/local/svn/repos
trunk/vendors/deli/

⑧、svnlook help

A、描述

svnlook help

显示svnlook的帮助信息,这个命令如同svn help的兄弟,也是你的朋友,即使你从不调用它,并且忘掉了邀请它加入你的上一次聚会。

B、别名

, h

⑨、svnlook history

⑦、svnlook dirs-changed

A、描述

svnlook history REPOS_PATH [PATH_IN_REPOS]

打印版本库(如果没有路径,则是根目录)某一个路径的历史。

B、选项

  • --revision (-r)

  • --transaction (-t)

C、例子

这显示了实例版本库中作为修订版本20的路径/tags/1.0的历史输出。

$ svnlook history -r 20 /usr/local/svn/repos /tags/1.0 --show-ids
REVISION   PATH <ID>
--------   ---------
      19   /tags/1.0 <1.2.12>
      17   /branches/1.0-rc2 <1.1.10>
      16   /branches/1.0-rc2 <1.1.x>
      14   /trunk <1.0.q>
      13   /trunk <1.0.o>
      11   /trunk <1.0.k>
       9   /trunk <1.0.g>
       8   /trunk <1.0.e>
       7   /trunk <1.0.b>
       6   /trunk <1.0.9>
       5   /trunk <1.0.7>
       4   /trunk <1.0.6>
       2   /trunk <1.0.3>
       1   /trunk <1.0.2>

⑧、svnlook info

A、描述

svnlook info REPOS_PATH

打印作者、时间戳、日志信息大小和日志信息。

B、选项

  • --revision (-r)

  • --transaction (-t)

C、例子

显示了你的实例版本库在修订版本40的信息输出。

$ svnlook info -r 40 /usr/local/svn/repos
sally
2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003)
15
Rearrange lunch.

⑨、svnlook log

A、描述

svnlook log REPOS_PATH

打印日志信息。

B、选项

  • --revision (-r)

  • --transaction (-t)

C、例子

这显示了实例版本库在修订版本40的日志输出:

$ svnlook log /tmp/repos/
Rearrange lunch.

⑩、svnlook propget

A、描述

svnlook propget REPOS_PATH PROPNAME [PATH_IN_REPOS]

列出版本库中一个路径一个属性的值。

B、别名

pg, pget

C、选项

  • --revision (-r)

  • --transaction (-t)

D、例子

这显示了HEAD修订版本中文件/trunk/sandwich的“seasonings”属性的值:

$ svnlook pg /usr/local/svn/repos seasonings /trunk/sandwich
mustard

⑪、svnlook proplist

A、描述

svnlook proplist REPOS_PATH [PATH_IN_REPOS]

列出版本库中一个路径的属性,使用--verbose选项也会显示所有的属性值。

B、别名

pl, plist

C、选项

  • --revision (-r)

  • --transaction (-t)

  • --verbose (-v)

D、例子

这显示了HEAD修订版本中/trunk/README的属性名称:

$ svnlook proplist /usr/local/svn/repos /trunk/README
  original-author
  svn:mime-type

这与前一个例子是同一个命令,但是同时显示了属性值:

$ svnlook --verbose proplist /usr/local/svn/repos /trunk/README
  original-author : fitz
  svn:mime-type : text/plain

⑫、svnlook tree

A、描述

svnlook tree REPOS_PATH [PATH_IN_REPOS]

打印树,从*PATH_IN_REPOS*(如果提供,会作为树的根)开始,可以选择显示节点修订版本ID。

B、选项

  • --revision (-r)

  • --transaction (-t)

  • --show-ids

C、例子

这会显示实例版本库中修订版本40的树输出(包括节点ID):

$ svnlook tree -r 40 /usr/local/svn/repos --show-ids
/ <0.0.2j>
 trunk/ <p.0.2j>
  vendors/ <q.0.2j>
   deli/ <1g.0.2j>
    egg.txt <1i.e.2j>
    soda.txt <1k.0.2j>
    sandwich.txt <1j.0.2j>

⑬、svnlook uuid

A、描述

svnlook uuid REPOS_PATH

打印版本库的UUID,UUID是版本库的Universal Unique IDentifier(全局唯一标示),Subversion客户端可以使用这个标示区分不同的版本库。

B、例子

$ svnlook uuid /usr/local/svn/repos
e7fe1b91-8cd5-0310-98dd-2f12e793c5e8

⑭、svnlook youngest

A、描述

svnlook youngest REPOS_PATH

打印一个版本库最年轻的修订版本号。

B、例子

这显示了在实例版本库显示最年轻的修订版本:

$ svnlook youngest /tmp/repos/ 
42

2.4、其他

①、svnserve

A、描述

svnserve允许Subversion版本库使用svn网络协议,你可以作为独立服务器进程运行svnserve,或者是使用其它进程,如inetd、xinetd或sshd为你启动进程。

一旦客户端已经选择了一个版本库来传递它的URL,svnserve会读取版本库目录的conf/svnserve.conf文件,来检测版本库特定的设置,如使用哪个认证数据库和应用怎样的授权策略。

B、选项

不象前面描述的例子,svnserve没有子命令——svnserve完全通过选项控制。

  • --daemon (-d):导致svnserve以守护进程方式运行,svnserve维护本身并且接受和服务svn端口(缺省3690)的TCP/IP连接。

  • --listen-port=PORT:在守护进程模式时导致svnserve监听*PORT*端口。

  • --listen-host=HOST:svnserve监听的*HOST*,可能是一个主机名或是一个IP地址。

  • --foreground:当与-d一起使用,会导致svnserve停留在前台,主要用来调试。

  • --inetd (-i):导致svnserve使用标准输出/标准输入文件描述符,更准确的是使用inetd作为守护进程。

  • --help (-h):显示有用的摘要和选项。

  • --version:显示版本信息,版本库后端存在和可用的模块列表。

  • --root=ROOT (-r=ROOT):设置svnserve服务的版本库的虚拟根,客户端提供的URL中显示的路径会解释为这个根的相对路径,不会允许离开这个根。

  • --tunnel (-t):导致svnserve以管道模式运行,很像inetd操作的模式(服务于一个标准输入/标准输出的连接),除了连接是用当前uid的用户名预先认证过的这一点。这个选项在客户端使用如ssh之类的管道时使用。

  • --tunnel-user NAME:与--tunnel选项结合使用;告诉svnserve假定NAME就是认证用户,而不是svnserve进程的UID用户,当希望多个用户通过SSH共享同一个系统帐户,但是维护各自的提交标示符时非常有用。

  • --threads (-T):当以守护进程模式运行,导致svnserve为每个连接产生一个线程而不是一个进程,svnserve进程本身在启动后会一直在后台。

  • --listen-once (-X):导致svnserve在svn端口接受一个连接,维护完成它退出。这个选项主要用来调试。

②、svnversion

A、描述

svnversion [OPTIONS] WC_PATH [TRAIL_URL]

总结工作拷贝的本地修订版本。

svnversion是用来总结工作拷贝修订版本混合的程序,结果修订版本号或范围会写到标准输出。

如果提供TRAIL_URL,URL的尾端部分用来监测是否WC_PATH本身已经跳转(监测WC_PATH的跳转不需要依赖TRAIL_URL)。

B、选项

像svnserve,svnversion没有子命令,只有选项。

  • --no-newline (-n):忽略输出的尾端新行。.

  • --committed (-c):使用最后修改修订版本而不是当前的(例如,本地存在的最高修订版本)修订版本。

  • --help (-h):打印帮助摘要。

  • --version:打印svnversion,如果没有错误退出。

C、例子

如果工作拷贝都是一样的修订版本(例如,在更新后那一刻),会打印修订版本:

$ svnversion .
4168

添加TRAIL_URL来展示工作拷贝不是从你希望的地方跳转过来的:

$ svnversion . /repos/svn/trunk
4168

对于混合修订版本的工作拷贝,修订版本的范围会被打印:

$ svnversion .
4123:4168

如果工作拷贝包含修改,后面会紧跟一个"M":

$ svnversion .
4168M

如果工作拷贝已经跳转,后面会有一个"S":

$ svnversion .
4168S

因此,这里是一个混合修订版本,跳转的工作拷贝包含了一些本地修改:

$ svnversion .
4212:4168MS

如果从一个目录而不是工作拷贝调用,svnversion假定它是一个导出的工作拷贝并且打印"exported":

$ svnversion .
exported

三、若干问题

3.1、svn查看日志显示连接服务器失败。你想使用缓存中的数据吗?

①、问题描述:

svn查看日志显示连接服务器失败。你想使用缓存中的数据吗?后面还有三个选项“立即离线、永远离线、取消“。点击取消显示“Item is not readable”,没有日志信息。

②、解决方案:

将svnserve.conf里的anon-access=read 改为anon-access=none。

3.2、svnserve: error while loading shared libraries: libaprutil-1.so.0: cannot open shared object file

找不到libaprutil-1.so.0,于是

find / -name libaprutil-1.so.0

结果为

/usr/local/apr/lib/libaprutil-1.so.0

将apr依赖包添加到共享库

查看共享库配置文件

more /etc/ld.so.conf
include ld.so.conf.d/*.conf

创建apr共享库配置文件

cd /etc
vi ld.so.conf.d

添加find的结果

/usr/local/apr/lib/libaprutil-1.so.0

更新共享库配置

ldconfig -v

检测是否安装成功

svn --version

3.3、解决svn log显示no author,no date的方法之一

①、问题

在linux执行svn log workingcopy,结果显示如下:

------------------------------------------------------------------------
r81 | (no author) | (no date) | 1 line
------------------------------------------------------------------------
r80 | (no author) | (no date) | 1 line
------------------------------------------------------------------------

r79 | (no author) | (no date) | 1 line
------------------------------------------------------------------------

在windows中的TortoiseSVN看到的结果如下:

01.png

两者均看不到任何日志信息,看文件历史也看不到,一片空白。

②、解决方案

在网上查了一下,大多是说权限问题,但是没看到说怎么改,其实很简单,只需要将svnserve.conf中的anon-access的权限改成none即可。

svnserve.conf文件位于:库目录/conf/svnserve.conf

这个文件更改了之后,svn server也不要重启,立即生效!

3.4、svn 保存的仓库名称不是项目名称

①、问题

svn 已保存的密码中查看

01.png

第二个项目的名称svn自动生成的标识,而不是项目名称

②、解决方案

在 svnserve.conf 中的 realm 配置项目的名称即可

realm = yilishabi

这个文件更改了之后,svn server不用重启,但是需配置服务器的自动更新。

进入 linux 切换到项目目录,执行 svn update输入服务器密码和svn 用户名和密码,之后保存密码。否则会出现以下情况:

01.png


暂时还没有评论,快来抢沙发吧~

发表评论

您需要登录后才可以评论。登录 | 立即注册
阅读 418