学会使用svn:externals
来源:互联网 发布:apache系列番号公司的 编辑:程序博客网 时间:2024/05/17 07:39
最近在与人合作的项目中使用了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
- 取得Zend Framework仓库的当前版本(head)::
- 保存文件退出编辑器,更新版本库:
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管理的项目组织上,这个我会在以后的文章进行说明。
- 学会使用svn:externals
- svn:externals使用!
- svn:externals使用!
- svn externals使用
- subversion中svn externals使用
- svn externals
- 使用svn:externals来重新组织svn结构
- 使用svn:externals建立SVN文件(夹)链接
- (转)使用svn:externals建立SVN文件(夹)链接
- 使用svn:externals建立SVN文件(夹)链接
- SVN: svn:externals
- 使用 Tortoise SVN 创建 Externals 外部引用目录
- 使用 Tortoise SVN 创建 Externals 外部引用目录
- svn,使用外部链接,让某些文件引用自其它项目的方法。SVN: svn:externals
- [SCM]源码管理 - SVN:externals
- 2小时学会使用SVN
- SVN的外部链接设置[svn:externals]
- Externals
- jbpm4.4表结构
- 人生当立志
- 快速的批量修改重命名.net程序的命名空间
- Android开发技术之──获取网络图片
- U-Boot移植
- 学会使用svn:externals
- 使用sql server management studio 2008 连接数据库,无法查看数据库,提示 无法为该请求检索数据 错误916
- C++图像处理 -- 图像颜色混合(上)
- [精华] [转贴]Curses函数说明(SCO)
- 非技术感悟
- 02-02 控制AutoCAD环境(二) 控制图形窗口(5)更新文档窗口的几何信息
- C#格式化
- Android 应用程序退出的四种方法
- NSIS脚本详解