Subversion 学习 三 高级功能

关于revision

在不可能记住每个revision 的具体号码的情况下,SVN 提供了DATE,keyword 两种额外的方式,同时这三种可以混用

Eg: svn diff r 1:HEAD ( 数字与keyword 结合)

SVN 中的revision KEYWORD

HEAD : 版本库中最新的(最年轻的)的版本

BASE : 本地的工作副本的revision ,指的是如果当前file 被修改,则修改前的revision

COMMITTED: 项目最近的修订版本,与BASE 相同或更早

PREV: 最后一次修改的revision 的之前一个revision ,基本上是COMMITED-1

 

Revision 时间表示:

$ svn checkout -r {2006-02-17}

$ svn checkout -r {15:30}

$ svn checkout -r {15:30:00.200000}

$ svn checkout -r {"2006-02-17 15:30"}

$ svn checkout -r {"2006-02-17 15:30 +0230"}

$ svn checkout -r {2006-02-17T15:30}

$ svn checkout -r {2006-02-17T15:30Z}

$ svn checkout -r {2006-02-17T15:30-04:00}

$ svn checkout -r {20060217T1530}

$ svn checkout -r {20060217T1530Z}

$ svn checkout -r {20060217T1530-0500}

使用{ } 包括的,符合ISO-8601

 

属性

1.  简介:

属性是SVN 中的高级功能,指的是在版本库的文件,目录上都可以绑定任意的namevalue 对,作为属性,namevalue 都可以是任意值,name 必须是ASCII 的,同时这些属性,也可以跟文件,目录一下,被SVN 记录历史,也就是说属性的修改可以回退。Revision 也可以有属性,与前面不同的是,revision 的属性不可以记录历史,一旦修改就不可回退,同时SVN 自己定义了一些属性,使用svn:

前缀,像revisionsvn:date,svn:author, svn:log 等,因为属性的不确定存在性,尽量不要假设某些属性存在。

属性的使用,主要是在一些自动化脚本中,对SVN 库中的文件进行的处理

 

SVN 的属性是很难定位的,很难去寻找一个需要的属性(往往需要递归),所以把信息放在log 中是比较好的选择,可以使用svn log 看到.

 

2.  操作

添加:

a) 纯文本

svn propset copyright ‘(c) 2006 Red-Bean Software' calc/button.c

b) 从文件读取(――file

svn propset license –F /path/to/LICENSE calc/ button.c

属性name 必须以字符,_: 起始,后面可以添加字母,数字,-,点号(.)

 

 

修改:

propedit

修改时,会打开一个用编辑器打开一个临时文件,同时修改,保存,如果不修改,不保存直接退出,SVN 不会做任何事

svn propedit copyright calc/button.c

 

同时,关于property 的操作,可以把多个文件放在一起操作,使用通配符

$ svn propset copyright '(c) 2006 Red-Bean Software' calc/*

property 'copyright' set on 'calc/Makefile'

property 'copyright' set on 'calc/button.c'

property 'copyright' set on 'calc/integer.c'

 

显示:

proplist

svn proplist calc/button.c

默认情况下显示提供路径下的文件名,和它的propertyname

添加――verbose (-v )选项会显示value

svn proplist –v calc/button.c

 

propget

通过文件名,proerty nameget value

svn propget copyright calc/button.c

 

 

删除:

a)  可以通过propset propedit propertyvalue 设成“”

b)  使用propdel

svn propdel copyright calc/button.c

 

属性与SVN 工作流

所有设置的属性只有在svn commit 之后才能永久生效,否则一个svn revert 就回去了,同时属性也存在conflict

一旦使用svn status calc/button.c 查看修改了属性而没有修改内容的文件,会发现M 状态标志出现在第二列,而不是第一列,同时svn diff calc/button.c 提示显示property changes

 

svn update 之后,发生property conflict 时,会产生一个.prej 后缀的临时文件,提供冲突信息,同时svn status 显示 C 在第二列, 用svn resolve 解决后,才可svn commit

 

属性的自动设置

 

因为一些属性需要设置在特定的文件上,才会起作用,但是这不太容易记住去做,所以SVN 提供了一些机制,自动设置一些属性。

比如在svn add svn import 一个新的file 到版本库时,SVN 会为它创建设置一个svn:executable 属性,标识这个文件的execute permission bit (我认为解释为可执行性),同时这个execute permission bitFAT32,NTFS 的文件系统中不存在定义,所以会设为*, 而且这个只是file 的属性,而不是dictionary

 

MIME type SVN 在文件提交的时候会去设置svn:mime-type 属性,主要用来判断文件是否是文本化的,如果设置了运行时配置参数mime-types-files( 一个映射文件用来通过文件后缀名判断文件的MIME TYPE), SVN 就会尝试去这个映射文件中找对应的MIME TYPE 来设置svn:mime-type, 如果没有设置或者找不到,SVN 就会判断文件中是否有nontextual 的内容,如果有就设置为application/octet-stream ,当然可以通过propset/propedit 改成你想要的

SVN 判断文件的MIME TYPE ,主要是为了在update 的时候,如果碰到冲突,文本化的文件可以被自动merge ,解决冲突,如果不是文本化的,SVN 就不能自动merge 而需要手动的resolve

同时MIME TYPE 主要是在浏览器中使用,让浏览器判断文件如何显示

 

 

面对不同的OS

面对不同的OS ,在许多细小的地方处理会有区别,比如文本文件的行结束符,UNIX 的符号连接,UNIXfilesystem permission 来判断文件可执行性 而WINDOWS 使用filename extension

 

SVN 的一些解决方法

1.  上面提到的svn:mime-type 属性

2.  上面提到的svn:executable 属性

3.  对于行结束符,使用svn:eol-style 属性,SVN 中存在下面几个值

a)  native, 即使用本地的EOL ,在Windows 上就是CRLF,UNIX 上就是LF

b)  CRLF, 导致文件使用CRLF 作为EOL 标志,不管OS

c)  LF

d)  CR

 

 

忽略未版本控制的条目

对于一些存放在本地的,不需要版本化的文件和目录,有时侯会错误的把他们commit ,因为这些文件同样在svn status 中状态AADD, 这时候可以通过两种方式来做到使SVN 忽略这些文件,svn status 不显示这些文件和目录

1.  通过SVN Configuration file 配置global-ignores 属性,它的值可以是多个通过空格分隔(whitespace-delimited)file pattern ,一旦文件和目录符合这些pattern ,就不会被svn status 显示

2.  通过在目录上的svn:ignore 属性,通过设置svn:ignore 属性可以使SVN 忽略在这个目录下的符合的file pattern 的文件,但是不包括在这个目录的子目录下的文件,同时不会覆盖global-ignore 的值,只是追加

Eg:

$ svn status calc

M calc/button.c

? calc/calculator

? calc/data.c

? calc/debug_log

? calc/debug_log.1

? calc/debug_log.2.gz

? calc/debug_log.3.gz

 

$ svn propedit svn:ignore calc    ## 打开一个editor 编辑file pattern

# 输入的pattern

calculator

debug_log*

# 添加后的svn stauts

$ svn status

M calc

M calc/button.c

? calc/data.c

# 这时候如果还想看到被ignore 的文件,则使用- -no-ignore 选项

$ svn status --no-ignore

M calc

M calc/button.c

I calc/calculator

? calc/data.c

I calc/debug_log

I calc/debug_log.1

I calc/debug_log.2.gz

I calc/debug_log.3.gz

 

 

关键字替换(keywork substitute)

SVN 的文件内容中,有一些关键字在每次修改(commitupdate )的时候都会被新的值替代。Update 时是别人做的commit ,在本地的工作副本中更新

包括:

1.  Date , 用来表示上次修改的时间, $Date: 2006-07-22 21:42:37 -0700 (Sat, 22 Jul 2006) $ 使用的是本地time zone , 同时也被称为 LastChangedDate .

2.  Revision , 用来记录上次修改的版本号 $Revision: 144 $ . , 同时也被称为

LastChangedRevision or Rev

3.  Author ,上次修改人, $Author: harry $ . 同时被称为 LastChangedBy

4.  HeadURL, 指向文件的SVN 地址, $HeadURL:http://svn.collab.net/repos/trunk/README $ . 被缩写为 URL .

5.  ID, 这个keyword 可以说是上面的4 个集合, 表示为:

$Id: calc.c 148 2006-07-28 21:30:43Z sally $ , calc.c 的文件 版本号148 2006.7.28 21:3043UTC )时间被sally 修改

 

 

稀疏目录

svn checkout 命令的时候,一般我们都会把URL 下的所有子目录,文件都递归的checkout ,但是如果我们不想这样怎么做?

使用- -depth 选项,它可以让我们有选择的下载需要的file 和目录,有4

1.  - -depth empty 只是当前目录,不包括它下的文件和子目录

2.  - -depth files 只是目录下的文件,不包括子目录

3.  - -depth immediate 只是目录下的文件和子目录,不包括子目录下的文件和目录

4.  - -depth infinity 完全下载

 

这个选项和老的选项 - -no-recursive(-N) - -recursive(-R) 相似。

 

同时,不只checkout 命令可以使用,在svn update, svn switch 都可以

使用方式略有不同, svn update - -set-depth NEW-DEPTH TARGET

Eg svn update - -set-depth files mom-empty

 

同时,使用svn info 命令可以查看当前目录的depth 情况

Eg: svn info mom-empty | grep “^Depth:”

 

 

 

锁定

在面对不是textContentfile 的时候,SVN 不能做到merge ,因此一旦出现conflict 就需要手动的resolve ,但是SVN 提供了一种lock 机制,能手动的lock file 然后别人就不能commit ,直到locker commit 然后解锁。

使用svn lock 命令

Eg svn lock branck.jpg –m “this is modified by Joel”

-m 提供comment ,像commit 一样,区别的是这里的-m 是可选的

这时候可以通过svn status, svn info 查看,

  Svn status 可以看到 file 的状态为 K

Svn info 可以看到更多的信息,包括lock 时 创建的token (随机),这个token 是保存在工作副本的本地,在commit 的时候进行验证,确保是locker 进行的提交

 

解锁:

1.  commit 的时候,只要是当前用户进行的lock ,所有的本地的lock 文件都会被解锁,即使用户没有提交那个lock 文件,同时也可以提供选项,不让SVN 解锁,- -no-unlock

2.  使用svn unlock 命令

 

其他用户,在commit 的时候,如果对lock file 进行修改,会报错。

这些用户可以通过svn info URL 来对lock file 进行查询,可以看到lockerlocktoken

 

其他用户解锁

其他用户可以brokelock ,通过svnlock svnadmin 工具

Eg svnadmin lslocks TARGET

可以显示这个TARGET 目录下的所有lock ,或这个TARGETfilelock

 

svnadmin rmlocks DICTIONARY TARGET

解除指定目录下的,指定filelock

 

同时,可以通过- -force 选项,使用svn unlock 强行解锁

svn unlock - -force URL

必须使用fileURLrepository 地址)来进行解锁

 

同时,可以通过- -force 选项,把broke lockre-lock 结合一起,作为一个atmoic 的命令

Eg svn lock - -force file

这里不需要URL ,只需本地的路径即可,这时不论file 之前被lock 与否,都被当前用户给lock 了,这时之前的locker ,如果svn status - -show-updates(-u) 会看到BT 状态,标志lockBrokesTolen

 

 

 

外部定义

解决的问题: 当需要checkout 不同的多个subdictionary ,而且多次时会显得很麻烦,这时可以用到外部定义,它在目录上定义一个svn:externals 属性,包含一些URL ,在checkout 当前这个目录的时候,就会接着去下载externals 中定义的URL

 

1.5 之前,定义格式为:

$ svn propget svn:externals calc

third-party/sounds http://svn.example.com/repos/sounds

third-party/skins -r148 http://svn.example.com/skinproj

third-party/skins/toolkit -r21 http://svn.example.com/skin-maker

本地存放路径  URL

 

1.5 时,格式可以为:

$ svn propget svn:externals calc

http://svn.example.com/repos/sounds third-party/sounds

-r148 http://svn.example.com/skinproj third-party/skins

-r21 http://svn.example.com/skin-maker third-party/skins/toolkit

 

$ svn propget svn:externals calc

http://svn.example.com/repos/sounds third-party/sounds

http://svn.example.com/skinproj@148 third-party/skins

猜你喜欢

转载自patrick002.iteye.com/blog/1105521