SVN 检出文件

需求

对于一些大工程, 整个 svn 仓库文件过大(动辄几十个G的都有),不想把整个 checkout 下来,但是又想维持整个目录结构以方便后续使用,那么可以使用 Subversion1.5 之后的 --depth 参数来只 checkout 需要的子目录.

如果只想把 svn 仓库里面某个文件 checkout 到本地, 不想 checkout 整个目录, 如何操作呢?

实施

假设需要 checkout 出来的文件是 ReadMe.md, 其 svn 地址是: http://svn.xxx.com/path/ReadMe.md,其上级目录的远程地址是 http://svn.xxx.com/path.

注意:以下出现 svn co 就是 svn checkout 的缩写.

方案一

大部分人都会在第一时间想到如下的操作:

1
svn co http://svn.xxx.com/path/ReadMe.md

实际上这样操作会报错的, 报错信息大概意思是 不可以 checkout 一个文件, 只能 checkout 目录

所以,该方案不可行。

方案二

第一步: checkout 目录

1
svn co --depth=empty http://svn.xxx.com/path/ ./

./ 表示当前目录,--depth=empty 表示检出空目录。

第二步: 更新文件

1
svn up ReadMe.md

这里直接 svn up 就可以将你需要的文件 checkout 出来了。

修改文件后, 也可以直接提交到 svn 仓库. 使用如下命令:

1
svn ci ReadMe.md -m "update."

方案三

使用 svn export 命令将文件导出,然后将 svn import 命令导入文件到 svn 仓库。

一般临时想 checkout 一个文件,就会使用 方案三, 比较正式的操作,我会选择 方案二,因为 方案二 这样既可在不增加磁盘大小的情况下保持 svn 仓库的目录结构,又可以任意 checkout 文件。

稀疏目录

上面的 方案二,其实就是 svn 的一种稀疏检出的操作。

Subversion 1.5 开始支持稀疏检出,允许对目录设置深度(depth)。

关于 depth 几个参数的含义:

–depth empty:只包含目录自身,不包含目录下的任何文件和子目录。

–depth files:包含目录和目录下的文件,不包含子目录。

–depth immediates:包含目录和目录下的文件及子目录。但不对子目录递归。

–depth infinity:这是默认的,包含整个目录树。

使用格式如下:

1
svn checkout URL --depth empty|files|immediates|infinity

或者

1
svn checkout URL --depth=empty|files|immediates|infinity
坚持原创技术分享!