修改已处于 SVN 版本控制下的项目的版本库布局
十一月 1st, 2007
按照《使用 Subversion 进行版本控制》 书中的建议,项目在被 import 到版本库前,最好能在项目根目录下建立 trunk、branches、tags 等目录,并将项目源代码存放在 trunk 子目录下,这将有利于工作中对相对稳定的项目做较大修改时创建分支。
但是一些历史项目,或者我们自己在对 Subversion 不够熟悉的情况下创建的项目,可能是直接把项目源代码存放在项目根目录里的,这种情况下要修改版本库布局,将所有文件移动到 trunk 子目录下就比较麻烦了。设想过使用 svn mv 命令应该可以做到,但是它会产生一个整个项目所有文件被移动的 revision,不但很不优雅,也不便于以后查看历史记录以及回溯到旧版本。
这种情况下我们可以这样做:
- 将整个项目的版本库导出为一个 dump 文件(它是一个可编辑的文本/二进制混合文件,其中包含了所有的 revision 记录)。
- 在 dump 文件中所有的路径前加上 trunk/ 前缀,使它们处于 trunk 子目录下。
- 在 dump 文件中 revision 1 里直接加入 trunk 等目录的创建。
- 删掉项目的版本库并重建新版本库,然后导入我们修改后的 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
Tags: GNU/Linux, Software 软件, SubversionNode-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 ...
Leave a Reply