最近在与人合作的项目中使用了Zend Framework。为保证项目稳定性和方便发布,合作者把框架导出(export)到他的版本库然后提交(check in)。因为ZF框架的文件大量频繁的更新,他放弃了从框架版本库导出(export)的本地版本库同步到版本控制服务器上的办法,每次更新框架的时候都从版本库中删除框架然后重新添加,

这在我看来是在是低效的,特别是考虑到这会让他从开发分支合并到产品分支非常困难。(删除并重新添加目录会在一定成都影响合并)我想会有更好的办法。

曾经听说过svn:externals属性,但是从来没有使用过。既然有这个属性,肯定有一个适合运用他的条件。问题是SVN电子书中 svn:externals说明文档 部分并没有说明这个属性该怎样设置,而且我发现很多”怎么做”条目都省去了一个或多个重要的细节。通过一些实验、排除一些自己的错误,最后我终于知道怎么弄了。因此我现在来分享这个处理过程,希望大家也能够从这次经历中得到经验。

事实上相当容易,假设你的你的项目文件系统结构想下面这样子:

project/    branch/        production/    tag/    trunk/
  • 在trunk目录下执行如下命令:

    svn propedit svn:externals .
  • 运行命令后会调用编辑器编辑属性。在编辑器打开的文件中,每行代表一个你要从那里取得代码的不同的外部svn仓库。一行中的第一段代表你想让取回代码存放的目录,最后一部分是取得代码的svn版本库URL。中间你还可以用一些可选配置参数来决定要取回的版本。以下是一些例子:
    • 取得Zend Framework仓库的当前版本(head)::

      framework http://framework.zend.com/svn/framework/trunk
    • 取得Zend Framework仓库的版本2616:
      framework -r2616 http://framework.zend.com/svn/framework/trunk
  • 保存文件退出编辑器,更新版本库:
    svn up
  • 提交所做更改:
    svn commit

请注意一点:在svn:externals中设置的取出代码存放目录在不能是你的版本库中已经存在的目录。如果存在,你会得到如下错误提醒:

svn: Working copy 'sharedproject' lockedsvn: run ’svn cleanup’ to remove locks

上面的例子中我使用的是版本,你也可以使用标签来取得外部仓库中特殊标签的版本。两种方法都能很好的工作。

现在,当我们实现分支之间或从主干到分支之间的转换时,你可以为每个分支设置不同的svn:externals属性。例如,你当期那的产品环境可能从某个特殊的版本中取出,但是你的主干需要跟进最新版本(head)。当你觉得可以实施这些改变的时候,你需要做的仅仅是查到主干的版本号然后更新产品版本的svn:externals属性即可。

希望这能帮祝你了解svn:externals。

使用svn——外部定义

在svn中提供了一个非常好的功能叫做外部定义,简单的说就是可以把外部的svn版本库映射到一个目录。这是一个本身很简单的功能,但是他却能给svn的使用和管理带来很多多变的功能。

首先详细的解释一下外部定义这个功能吧。我们用一个用户的使用场景来说明一下。说的尽量的详细,所以比较啰嗦:)。
假设现在有两个团队,一个是开发组(dev-team),一个是文档组(doc-team),共同开发一个产品。这两个小组各自有各自的管理等等原因,所
以分开使用svn比较好,所以共有两个svn版本库,dev-svn和doc-svn。我们假设这两个版本库都使用标准的组织结构(详细对组织结构的讨论
请看以后的文章),现在的开发都是在trunk进行的。开发组,trunk下的目录组织为src,lib,build等等。
对于两个小组的开发,测试,管理,分开使用没有任何问题,也不会相互的有影响。但是面对最终产品发布的时候,要做安装程序,这时候就必须同时操作两个项
目。而很明显的一个普遍的组织结构就是doc-team开发的文档作为dev-team开发的程序等等的一部分。那么在dev-svn的trunk下,就
应该有一个叫做doc的目录,目录的内容是doc-svn的trunk的内容。
此时,我们就可以利用svn的外部定义功能来完成这个任务。svn的外部定义,其实是给(父)目录加上的一个 属性(svn properties,详情后文介绍),这个属性定义了要引用哪个外部的版本库并且放在(父)目录下的哪个(子)目录中。
给父目录添加一个叫做svn:externals的属性,属性的内容是doc-name svn-url,svn-url表示要引用哪个svn的连接,doc-name表示这个引用放在哪个目录下
在上面的场景中,我们要给dev-svn的trunk目录设置一个属性sv:externals,属性的值是doc

http://doc-svn/trunk,这样当你设置完之后,update一下本地工作区,biu的一下,doc就过来了,这时候从dev-svn的

trunk的角度看,就有了完整的内容,包括doc。
完整的命令是,在chechout下来的dev-svn的trunk目录下
#svn propset svn:externals “doc http://doc-svn/trunk” .
propset,表示使用propset命令,添加属性
svn:externals,表示要添加svn:externals属性
“doc http://doc-svn/trunk”,表示要给这个属性添加的值,因为这个属性包含空格,所以要用双引号括起来
之后的点,表示要把这个属性添加在本目录上

啰嗦了一通,想必大家看的也是云山雾罩的,自己做个试验就可以了。

一些高级的外部定义的用法,我们对一个目录不但可以定义一个外部定义,还可以定义多个。比如doc来自doc-svn,website来自web-svn等等。这时候我们需要把这些东西都作为svn:externals的属性值。
doc http://doc-svn/trunk
website http://web-svn/trunk
注意!这里是需要换行的,这个对于命令行来说,是非常痛苦的,而且外部定义这种值里面还包含空格的需要用双引号括起来的值来说,就是痛苦死了。好吧,我承认我到现在也没有成功的设置过。怎么办?好吧,我们可以用另外的方法来搞定。
svn propset这个命令可以使用一个外部文件的文件内容作为给属性添加的值。命令如下
svn propset svn:externals -F filename .
所以,一般的,凡是需要用到这类用法的地方,我都会生成一个文件叫做LINKS,放到svn上管理。LINKS的内容如下
doc http://doc-svn/trunk
website http://web-svn/trunk
这样我们就可以使用svn propset svn:externals -F LINKS . 这个命令来设置了。

对属性的替换,直接set一个其他的值就好了。可是,如果我们不想要这个外部定义了怎么办?注意!这里千万不能使用svn del命令(比如在dev-svn的trunk目录下执行svn del doc),这样你删除的不是这个外部定义,而是你引用的svn版本库的内容。如果很幸运的,你是在另外的项目有写入的权限,好了,恭喜你,你已经把那个项目咔嚓掉了。
正确的做法是使用svn propdel命令来删除掉svn:externals这个属性
svn propdel svn:externals

最后还要提醒一点,这个属性是放在这个目录上的,对于svn来说,目录也是受到管理的,目录和目录内的文件之类的是不同的。所以你如果只想对这个目
录进行操作,而不像对它下面的文件进行操作,使用svn的时候,记得加上-N参数。比如类似svn:externals这样的属性就是针对目录的。

其实外部定义,还有很多的高级的使用功能,具体的我就不详述了,请参阅svn的帮助或者阅读文档,http://svndoc.iusesvn.com/svnbook/1.2/svn.advanced.externals.html。 最新的文档(针对1.4,1.5的)是英文的,嘿嘿。

外部定义还有一些玩法,更多的还是在使用在基于svn管理的项目组织上,这个我会在以后的文章进行说明。

转载于:https://www.cnblogs.com/chingliu/archive/2011/07/05/2223818.html

学会使用svn:externals相关推荐

  1. [SCM]源码管理 - SVN:externals

    svn的外部定义svn:externals 转自:http://blog.csdn.net/jaconey/archive/2008/05/15/2448986.aspx 解决你的外部依赖 -- sv ...

  2. How to add svn:externals in windows using TortoiseSVN

    1. 打开你要添加SVN外部定义项目的根目录. 2. 右击根目录,选择 TortoiseSVN –> Properties. 3. 依次进行下面操作. 4.   在Local Path中写入目标 ...

  3. 【SVN】linux下svn命令参数详解(二)

    svn全部子命令详解 1.svn help 2.svn add 3.svn blame 4.svn cat 5.svn changelist 6.svn checkout 7.svn cleanup ...

  4. svn上crlf怎么设置_svn如何设置svn:ignore

    展开全部 svn help 中有 propset propget propdel proplist propedit五个关于prop,也就是svn属性的设置. 在当前的svn工作拷3231313335 ...

  5. SVN四部曲之SVN设置详解深入

    想知道不同的设置是干什么用的,你只需将鼠标指针在编辑框/选项框上停留一秒钟...一个帮助提示气泡就会弹出来. 常规设置 图 4.68. 设置对话框,常规设置页面 这个对话框允许你指定自己喜欢的语言,同 ...

  6. 项目如何从 SVN 迁移到 Git

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 版本管理 SVN版本管理:场景命令实战 SVN版本管理:两种开发模式 GIT版本管理:场景命令实战 GIT版本管理: ...

  7. linux svn 设置propertise

    svn下载代码时遇到如下错误 svn: warning: W200000: Error handling externals definition for 'web': svn: warning: W ...

  8. SVN命令--命令大全

    原文网址:SVN命令--命令大全_IT利刃出鞘的博客-CSDN博客 大部分的发行版都已经提供Subversion套件,ubuntu下安装subversion客户端:  sudo apt-get ins ...

  9. mac svn 服务器及客户端

    闲来无事,自己在Mac系统上搭建了一个svn服务器,跟大家分享一下. Mac系统已经自带了svn,我们已经不需要安装svn服务器了,简单的几步配置就可以开启我们的svn服务器了. 1.打开termin ...

最新文章

  1. 浙大首届AI专业本科生将于9月入学,纳入竺院图灵班
  2. phpcurl 请求Chunked-Encoded data 遇到的一个问题
  3. Java基础之Comparable接口和Comparator接口的比较
  4. 20210907 Engine and SDK in development
  5. 关于Eclipse创建Android项目时,会多出一个appcompat_v7的问题
  6. python字典进行大写转化_python之字典的增删改查
  7. PCA原理分析和意义(一)
  8. AWK命令进行字符串替换-图解两个例子(转)
  9. Xshell远程访问工具及epel-release包安装
  10. 网站地图生成器_10个相见恨晚的PPT网站 让你看一眼就心动
  11. 1.3 c++程序的构成和书写形式
  12. 格兰杰检验的基本步骤_Toda-Yamamoto 格兰杰因果检验 TY-Granger方法
  13. 【BUUCTF】[SWPU2019]神奇的二维码
  14. 101名女职工血清总胆固醇测量结果spss描述统计分析
  15. 实现isprime函数python,怎样才能实现IsPrime()函数
  16. 常见的 360° 全景视频格式介绍及播放方式
  17. 一个low逼的boofuzz脚本生成器
  18. 怎样使用JS代码代码跳转的方法
  19. 基于STM32F103智能小车黑线寻迹运动实验(有代码)
  20. 记从开始到现在(一)

热门文章

  1. NET中winform与webform互相通讯实例,CS调用BS页面的JS函数---转载
  2. 产品生成器---父子产品模型
  3. linux批量部署war工具,Linux批量部署工具Expect
  4. atm c语言流程图_c语言ATM机程序
  5. html模板存储在mysql_Python爬虫架构5模板 | 你真的会写爬虫吗?
  6. vim中taglist使用
  7. LightOJ-1028 Trailing Zeroes (I)---因子数目
  8. The application was unable to start correctly (0xc000007b)
  9. elasticsearch配置小记
  10. Socket 同步/异步 与阻塞/非阻塞区别