按照《使用 Subversion 进行版本控制》 书中的建议,项目在被 import 到版本库前,最好能在项目根目录下建立 trunk、branches、tags 等目录,并将项目源代码存放在 trunk 子目录下,这将有利于工作中对相对稳定的项目做较大修改时创建分支。

但是一些历史项目,或者我们自己在对 Subversion 不够熟悉的情况下创建的项目,可能是直接把项目源代码存放在项目根目录里的,这种情况下要修改版本库布局,将所有文件移动到 trunk 子目录下就比较麻烦了。设想过使用 svn mv 命令应该可以做到,但是它会产生一个整个项目所有文件被移动的 revision,不但很不优雅,也不便于以后查看历史记录以及回溯到旧版本。

这种情况下我们可以这样做:

  1. 将整个项目的版本库导出为一个 dump 文件(它是一个可编辑的文本/二进制混合文件,其中包含了所有的 revision 记录)。
  2. 在 dump 文件中所有的路径前加上 trunk/ 前缀,使它们处于 trunk 子目录下。
  3. 在 dump 文件中 revision 1 里直接加入 trunk 等目录的创建。
  4. 删掉项目的版本库并重建新版本库,然后导入我们修改后的 dump 文件。

进行这样的操作后,项目的版本库状态就是从 revision 1 开始所有的文件就存在于 trunk 目录下了。

具体操作步骤,以在 Linux 命令行下为例:

svnadmin dump /path_to_svn_repos/your_project > your_project.svn_dump
vim -b your_project.svn_dump
# 以下为 Vim 命令
:%s/^Node-path:\s\+/\0trunk\//ge
:%s/^Node-copyfrom-path:\s\+/\0trunk\//ge
# Vim 命令结束
# 添加 trunk 等目录的创建,见后文详述
rm -rf /path_to_svn_repos/your_project
svnadmin create /path_to_svn_repos/your_project
svnadmin load /path_to_svn_repos/your_project < your_project.svn_dump

注意一定要用 -b 参数启动 Vim,这样可以避免 Vim 在没有配置好多字节文件支持的选项时对 dump 文件可能的破坏。添加 trunk 等目录的方法是在 Revsion-number: 1 那一行后的第一个 PROPS-END 行后插入以下蓝色的代码。注意那些空行,有些是空一行有些是空两行,我是严格按照已有的目录的格式来写的,在没有看到这个 dump 文件的规格文档前最好连空行也照原样复制。

...
Revision-number: 0
Prop-content-length: 56
Content-length: 56

K 8
svn:date
V 27
2007-10-11T14:15:09.781135Z
PROPS-END

Revision-number: 1
Prop-content-length: 100
Content-length: 100

K 7
svn:log
V 0

K 10
svn:author
V 6
rainux
K 8
svn:date
V 27
2007-10-11T14:15:48.344335Z
PROPS-END
Node-path: trunk
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10

PROPS-END


Node-path: branches
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10

PROPS-END


Node-path: tags
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10

PROPS-END

Node-path: trunk/README
Node-kind: file
Node-action: add
Prop-content-length: 10
Text-content-length: 8001
Text-content-md5: 2ffe7715fd6ba5509508a29022c22a17
Content-length: 8011

PROPS-END
== Welcome to Rails
...
Tags: , ,

Leave a Reply