使用svn.externals(外链)提升美术多个svn目录的svn up速度

发布时间 2023-08-29 23:54:20作者: 赵青青

svn up多个目录耗时大

svn上的美术资源项目,在打包机上对一个很久没有变化的目录进行svn up也是需要消耗不少时间的,特别打包时需要对多个目录进行svn up,比如空跑54个目录的svn up耗时在3分多钟,而通过svn:externals把这些目录外链到一个目录下,可以大大减少svn up的时间。


关于svn:externals的介绍

假如你的 SVN 项目分为客户端、服务端,它们需要用到同一份配置,那么可以在 /client/common 、 /server/common 目录中存放相同的配置文件,但是每次一方修改后都要手动复制修改到另外一个目录?这也太麻烦了吧,有没更好的方法呢?这篇文章给你讲解如何使用 svn:externals 完美的解决。

假设我们的目录结构如下图所示,服务端客户端都有一个 common 目录:
目录结构

最简单的方法也是最笨的方法,就是每次修改后都手动复制文件到另外一个目录,人工确保两个目录的文件一致,这很容易出问题。

稍微好点的方法是,在 /server/common 目录检出(checkout)一份 /client/common,这样省去了复制文件的麻烦,每次只需要到 common 目录进行 update 就行了。但是,我们必须记得要进去 common 目录进行更新才行,直接在外层目录进行 update 是不会更新的。

其实,SVN 还有提供一个叫 externals 的属性,可以用来在目录中引入其他 SVN 地址目录,更新时还会同步自动更新这个引入的 external 目录。

在你需要的目录,右键选择 TortoiseSVN - Properties:
svn properties

在打开的属性窗口中,我们点击新建添加外部(Externals)SVN 目录
svn external

填写保存目录(Local path),外部 SVN 地址(URL),最后点击确定
add-external

添加成功后,我们可以看到属性列表窗口已经列出来我们刚添加的地址了。
这样,我们就把客户端 /client/common 目录引入到了 /server/common
after-add

现在,我们更新试下,发现外部引入的 SVN 目录也会自动更新了,而且不需要进入 common 目录去更新,在父目录也是可以更新到的。
另外,这个外部引入的 SVN 目录,你一样可以进行修改提交,然后其他地方都能更新到这个修改。
update externals

提醒下大家,这个引入外部 SVN 目录是可以任何 SVN 地址的,不管你是不是同个 SVN 仓库都行。


批量设置svn:externals

上述是单个设置,如果我们有非常多个目录需要外链,那么把这些外链批量设置到某个目录的属性上。

  1. 在纳入svn控制的目录下创建一个文本用来保存所有的外链路径,比如叫:external.txt
  2. 在externals.txt中按行增加外链,格式:文件夹 svn地址
  3. 写一个get_all_svn.bat,填入以下内容,双击执行它就会对我们当前目录增加属性,只需要初始化一次
  4. 后面每次只需要在当前目录下进行svn up就可以正常更新下所有外链的内容

get_all_svn.bat,内容:

svn:externals . -F external.txt
svn up

external.txt,文件的内容示例:

文件夹名字1 https://subversion.assembla.com/svn/your_assembla_space/trunk/
文件夹名字2 http://subversion.assembla.com/svn/your_assembla_space_2/trunk

详细介绍:Using SVN Externals Definitions | Assembla Help Center --- 使用 SVN 外部定义 |组装帮助中心