HelloWorld 善战者,求之于势,不责于人;故能择人而任势。

知止而后有定,定而后能静,静而后能安,安而后能虑,虑而后能得。物有本末,事有终始。知所先后,则近道矣。

  BlogJava :: 首页 ::  :: 联系 ::  :: 管理 ::
  167 随笔 :: 1 文章 :: 40 评论 :: 0 Trackbacks
http://cb.esast.com/cb/wiki/29777

svn:external 用法

 

 

如果您有 2 个项目是使用共同开发的方式,且其中一个项目会使用到另一个项目中某部分的程序代码,在此种情況下就可以使用 svn:externals 属来设置。

例如:A 公司是制作 IC 晶片的厂商,B 公司会向 A 公司购买 IC 晶片来加工,而这些晶片里也都会使用程序代码,可能这些程序代码会有些 Bug,如果 A 公司有许多间合作的厂商,或是有多样的程序代码产品,当 A 公司修改了 Bug 而 B 公司或其它的合作公司会知道修改了哪些 Bug 吗?那么这些合作公司要如何使这些程序代码和 A 公司的程序代码同步?这时就可以使用 svn:external 属性来设置,当 B 公司或其它公司设置好 svn:externals 属性,他们只要每次去更新就会看到 A 公司有修改了哪些 Bug 了。因此, svn:externals 属性的设置可以帮助公司间或是同事间的合作便利性,可消除多种复杂的情況增加效率。

接下來为您详细介绍 svn:externals 的设置方式。

安装 TortoiseSVN

请使用 TortoiseSVN 来设置 svn:external 属性,TortoiseSVN 工具可在http://tortoisesvn.net/downloads下载。

svn:externals 语法

常规设置

最基本的设置,是使用下面的语法,版本库位置和目录名称可以对调:

版本库位置 目录名称
例如:http://localhost/svn test

目录名称 版本库位置
例如:test http://localhost/svn

假如您要设置的目录名称及版本库中的目录名称如 "test svn" 中间有空白的,可以使用下面的语法:

http://localhost/svn/test%20svn "test svn"

版本库的目录名称中有空白以 "%20" 代替,如果是客户端上的目录名称请加上 "" 符号。

如果您要设置目录中的某一版本,可以使用下面的语法:

-r5 http://localhost/svn/project1 test/abc

-r5 是设置http://localhost/svn/project1的第 5 版,可在 5 的地方设为您要的版本,您也可将要设置的客户端目录设置为某个目录的子目录如上面的 test/abc。

范例一

假设我们目前有 2 个项目分別是 A_project 和 B_project,而这 2 个项目的架构如下:

A_project                                                  B_project
     |-tags                                                   |-tags
     |-branches                                              |-branches
     |-trunk                                                  |-trunk
           |-docs                                                   |-docs
           |-libs                                                    |-libs
           |-src                                               |-src
                |-part_a → a1,a2,a3,a4,a5           |-part_c → c1,c2,c3
                |-part_b → b1,b2,b3,b4,b5,b6                  |-part_d → d1,d2,d3
                |-part_f → f1,f2,f3,f4                                |-part_e → e1,e2
                                                                          |-part_g → g1,g2,g3

我们将 A_project 和 B_project签出,目前将这 2 个 签出到桌面:

接下來我们要做的动作是将 A_project/trunk 下的 src 目录设置 svn:externals 属性,设置的目录为 B_project/trunk/src 下的 part_c 目录。

首先,我们使用资源管理器先把目录移到 A_project/trunk ,然后在 src 目录点击右键 → 选择 "TortoiseSVN" → "Properties":

选择 "New..." 按钮:

请先在 Property name 选择 svn:externals ,然后在 Property value 键入以下语法:

名称 另一项目目录的版本库位置

例如:part_c https://localhost/svn/B_project/trunk/src/part_c

下面的 "Apply property recursively" 选项,如果勾选了,則在 A_project/trunk/src 下的所有目录底下都會新增一個 part_c 的目录,如果沒有勾选,则只会在 A_project/trunk/src 目录下新增 part_c 目录,在这里我们不勾选此选项,设置完后请按下 OK 按钮:

按下 OK 按钮后,就会在前一个画面新增 svn:externals 属性:

  • Import...:可将之前导出的属性文件导入。
  • Export...:导出成属性文件,扩展名为:*.svnprops。
  • Save...:储存为Binary文件,可以使用Load按钮来设置。
  • Remove:移除设置好的属性。
  • Edit...:编辑属性。
  • New...:新增属性。

按下 OK 按钮后,您就会看到 src 目录出现 "!" 的icon:

再将此变更提交,然后再更新,您会看到以下结果:

在 A_project/trunk/src 目录下新增了 part_c 目录的所有内容,而 part_c 目录的版本为 6,这是 B_project 的目前版本。而在下面的版本10是目前 A_project 的版本。

如果您到 A_project/trunk/src 下的内容,会看到新增了一个 part_c 目录:

范例二

A_project/trunk/src 设置了 svn:external 属性,在 src 下新增了 part_c 目录,其目标为 B_project/trunk/src/part_c,而这二个 part_c 目录是有关联的,如果您在 A_project 的 part_c 产生变更,則 B_project 的 part_c 就会有一样的变更(在更新后),反之,如果您在 B_project 的 part_c 产生变更,则此变更也会反映在 A_project 的 part_c 上,接下來我们來示范此例子:

首先我们在 A_project 的 part_c 产生一个变更,我们来产生一个新的文件,名称为 c4:

然后将此变更提交,则产生下图结果:

范例一 part_c 最后的版本为 6,在这里您会看到版本变为 7,如果您在 src 的目录下使用更新的选项,则会看到 A_project 的版本仍然是 10,因为此次的变更可以说是和 A_project 无关,所以 A_project 的版本沒有变动。

如果您再到 B_project 使用更新的选项,则会看到下图结果:

您会看到在 part_c 目录下新增了 c4 文件,且版本变为 7。

我们再做一个例子。

这次在 A_project/trunk/src/part_a 新增一个文件 a6,也在 A_project/trunk/src/part_c 新增另一个文件 c5:

A_project/trunk/src/part_a A_paroject/trunk/src/part_c

然后再将此次变更提交,最后您会看到下图的结果:

part_c 目录版本变为 8,A_project的版本变为 11。

如果您在 B_project 使用更新,则会看到下图的结果:

范例三

在此范例示范在常规设置有提到的语法。

我们在范例一范例二皆有示范过下面的范例,所以在此就不再示范:

http://localhost/svn test

但您也可以使用下面的语法來试试看:

test http://localhost/svn

接下來我们示范此语法:

http://localhost/svn/test%20svn "test svn"

我们先在 B_project/trunk/src 下新增一个 part h 目录,然后将此变更提交:

在 A_project/trunk/src 按右键选择 TortoiseSVN → Properties,选择 New 按钮并设置 svn:externals 属性的变量为:

https://localhost/svn/B_project/trunk/src/part%20h "part h"

中间 %20 代表的是空格,后面的 part h 目录因为中间有空格,所以需加上 " " ,键入完后将此变更提交并更新,您就会看到在 A_project/trunk/src 目录下多了一个 part h 目录:

再來是关联某一版本的语法:

-r5 http://localhost/svn/project1 test/abc

在 B_project/trunk/src 按右键选择 TortoiseSVN → Properties,选择 New 按钮并设置 svn:externals 属性的变量为:

-r5 https://localhost/svn/A_project/trunk/src src_r5

键入完后将此变更提交并更新,您就会看到 src_r5 目录的版本为 5:

高级设置

 

除了常规设置的语法外,另外就是可以使用类似相对路径的设置方式,此种方式分为下面 4 种:

  • 关联父目录,使用符号为 "../",依照您目前所设置的目录位置来设置。
  • 关联根目录,使用符号为 "^/",直接将目录移到版本库的根目录来设置。
  • 关联 URL scheme,使用符号为 "//",取代 URL 前面的 http://、https://、svn+ssh://。
  • 关联 Server hostname,使用符号为 "/",取代 URL 的hostname和前面的 http://、https://、svn+ssh://。

范例四

在此范例,我们示范如何使用 "../"

首先,我们在 A_project/trunk/src 目录下新增 part_i 目录,然后将此变更提交:

然后我们在 B_project/trunk/src 目录设置 svn:externals 属性,键入如下:

../../../A_project/trunk/src/part_i part_i

其实此路径同等於 "https://localhost/svn/A_project/trunk/src/part_i",因为是设置 src 目录,第一次的 ../ 是回到 trunk 目录,第二次的 ../ 是回到 B_project 目录,第三次的 ../ 就是回到 svn,然后再指定 A_project/trunk/src 目录下的 part_i,使用此语法的诀窍,就是要知道自己所设置的目前目录和目标目录的路径关系。

键入完后,将此变更提交后更新,就会在 B_project/trunk/src 目录下看到 part_i:

此语法只适合使用在 Repository 在相同 Server 的情況。

范例五

在此范例,我们示范如何使用 "^/"

首先,我们在 A_project/trunk/src 目录下的 docs 目录设置 svn:externals 属性,设置如下:

^/../B_project/trunk/docs projectb/docs

此路径同等於 "https://localhost/svn/B_project/trunk/docs",^/ 符号会直接跳到版本库的根目录,所以在这里会跳到 A_project 目录,后面的 ../ 会回到 svn,然后再指定 B_project/trunk/docs 目录,而后面的 projectb/docs,是会将 B_project/trunk/docs 目录放在 A_project/trunk/src/docs/projectb/docs 目录,链入完后您就会在 A_project/trunk/src/docs/projectb 目录下看到 docs 目录:

此语法只适合使用在版本库在相同服务器的情況。

范例六

在此范例我们示范如何使用 "//"

首先,我们在 A_project/trunk/libs 目录设置 svn:external 属性,设置如下:

//192.168.1.2/svn/project2/trunk/libs "project2 libs"

//是取代 URL 前面的 http://、https://、svn+ssh://,依照您签出時是使用哪一种协议來取代,像此例的 A_projet 在当初签出时所使用的协议是 https://,所以此路径为 "https://192.168.1.2/svn/project2/trunk/libs"。

键入完成后将此变更提交后更新,您即可在 A_project/trunk/libs 目录下看到 project2 libs 目录:

此语法可使用在不同服务器的版本库,但您必须确定不同的 服务器所使用的协议都是一样的。

范例七

在此范例我们示范如何使用 "/"

首先,我们在 B_projet/trunk/libs 目录设置 svn:externals 属性,设置如下:

/svn/A_project/trunk/libs "projecta libs"

/ 是取代 URL 前面的协议和hostname,依照您设置目录所 签出的 URL 來取代,所以在这里所取代的是 "https://localhost",因此这里所设置的路径就是 "https://localhost/svn/A_project/trunk/libs"。

键入完后请将此变更提交后更新,您即可以在 B_project/trunk/libs 目录下看到 projecta libs 目录:

此语法只适合使用在版本库在同一个服务器的情況。

但在这里要特別注意的是:当您再去打开 projecta libs 目录时,会在此目录下看到 project2 libs,因为在范例六我们有设置 A_project/trunk/libs 目录关联到 https://192.168.1.2/svn/project2/trunk/libs,目录名称为 project2 libs,在此范例我们将 B_project/trunk/libs 目录关联到 A_project/trunk/libs,目录名称为 projecta libs:

所以这告诉我们,如果您要设置的关联目录下,还有关联其它的目录,都会被一并被带进您要设置的目录底下,如果您要设置的目录不想要有其它的关联,那么您就必须去特別注意这一点。



</script>

posted on 2011-08-08 11:53 helloworld2008 阅读(929) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: