SVN 迁移项目分支

svndumpfilter

因为Subversion使用底层的数据库储存各类数据,手工调整是不明智的,即使这样做并不困难。何况,一旦你的数据存进了版本库,通常很难再将它们从版本库中删除。[13]但是不可避免的,总会有些时候你需要处理版本库的历史数据。你也许想把一个不应该出现的文件从版本库中彻底清除。或者,你曾经用一个版本库管理多个工程,现在又想把它们分开。要完成这样的工作,管理员们需要更易于管理和扩展的方法表示版本库中的数据,Subversion版本库转储文件格式就是一个很好的选择。

Subversion版本库转储文件记录了所有版本数据的变更信息,而且以易于阅读的格式保存。可以使用svnadmin dump命令生成转储文件,然后用svnadmin load命令生成一个新的版本库。(参见 “版本库的移植”一节)。转储文件易于阅读意味着你可以小心翼翼的查看和修改它。当然,问题是如果你有一个运行了两年的版本库,那么生成的转储文件会很庞大,阅读和手工修改起来都会花费很多时间。

虽然在管理员的日常工作中并不会经常使用,不过svndumpfilter可以对特定的路径进行过滤。这是一个独特而很有意义的用法,可以帮助你快速方便的修改转储的数据。使用时,只需提供一个你想要保留的(或者不想保留的)路径列表,然后把你的版本库转储文件送进这个过滤器。最后你就可以得到一个仅包含你想保留的路径的转储数据流。

svndumpfilter的语法如下:

$ svndumpfilter help
general usage: svndumpfilter SUBCOMMAND [ARGS & OPTIONS ...]
Type "svndumpfilter help <subcommand>" for help on a specific subcommand.

Available subcommands:
   exclude
   include
   help (?, h)

有意义的子命令只有两个。你可以使用这两个子命令说明你希望保留和不希望保留的路径:

exclude

将指定路径的数据从转储数据流中排除。

include

将指定路径的数据添加到转储数据流中。

现在我来演示如何使用这个命令。我们会在其它章节(参见 “选择一种版本库布局”一节)讨论关于如何选择设定版本库布局的问题,比如应该使用一个版本库管理多个项目还是使用一个版本库管理一个项目,或者如何在版本库中安排数据等等。不过,有些时候,即使在项目已经展开以后,你还是希望对版本库的布局做一些调整。最常见的情况是,把原来存放在同一个版本库中的几个项目分开,各自成家。

假设有一个包含三个项目的版本库: calccalendar,和 spreadsheet。它们在版本库中的布局如下:

/
   calc/
      trunk/
      branches/
      tags/
   calendar/
      trunk/
      branches/
      tags/
   spreadsheet/
      trunk/
      branches/
      tags/

现在要把这三个项目转移到三个独立的版本库中。首先,转储整个版本库:

$ svnadmin dump /path/to/repos > repos-dumpfile
* Dumped revision 0.
* Dumped revision 1.
* Dumped revision 2.
* Dumped revision 3.
…
$

然后,将转储文件三次送入过滤器,每次仅保留一个顶级目录,就可以得到三个转储文件:

$ cat repos-dumpfile | svndumpfilter include calc > calc-dumpfile
…
$ cat repos-dumpfile | svndumpfilter include calendar > cal-dumpfile
…
$ cat repos-dumpfile | svndumpfilter include spreadsheet > ss-dumpfile
…
$

现在你必须要作出一个决定了。这三个转储文件中,每个都可以用来创建一个可用的版本库,不过它们保留了原版本库的精确路径结构。也就是说,虽然项目calc现在独占了一个版本库,但版本库中还保留着名为calc的顶级目录。如果希望trunktagsbranches这三个目录直接位于版本库的根路径下,你可能需要编辑转储文件,调整Node-pathCopyfrom-path头参数,将路径calc/删除。同时,你还要删除转储数据中创建calc目录的部分。一般来说,就是如下的一些内容:

Node-path: calc
Node-action: add
Node-kind: dir
Content-length: 0

警告

如果你打算通过手工编辑转储文件来移除一个顶级目录,注意不要让你的编辑器将换行符转换为本地格式(比如将\r\n转换为\n)。否则文件的内容就与所需的格式不相符,这个转储文件也就失效了。

剩下的工作就是创建三个新的版本库,然后将三个转储文件分别导入:

$ svnadmin create calc; svnadmin load calc < calc-dumpfile
<<< Started new transaction, based on original revision 1
     * adding path : Makefile ... done.
     * adding path : button.c ... done.
…
$ svnadmin create calendar; svnadmin load calendar < cal-dumpfile
<<< Started new transaction, based on original revision 1
     * adding path : Makefile ... done.
     * adding path : cal.c ... done.
…
$ svnadmin create spreadsheet; svnadmin load spreadsheet < ss-dumpfile
<<< Started new transaction, based on original revision 1
     * adding path : Makefile ... done.
     * adding path : ss.c ... done.
…
$

svndumpfilter的两个子命令都可以通过选项设定如何处理“空”修订版本。如果某个指定的修订版本仅包含路径的更改,过滤器就会将它删除,因为当前为空的修订版本通常是无用的甚至是让人讨厌的。为了让用户有选择的处理这些修订版本,svndumpfilter提供了以下命令行选项:

--drop-empty-revs

不生成任何空修订版本,忽略它们。

--renumber-revs

如果空修订版本被剔除(通过使用--drop-empty-revs选项),依次修改其它修订版本的编号,确保编号序列是连续的。

--preserve-revprops

如果空修订版本被保留,保持这些空修订版本的属性(日志信息,作者,日期,自定义属性,等等)。如果不设定这个选项,空修订版本将仅保留初始时间戳,以及一个自动生成的日志信息,表明此修订版本由svndumpfilter处理过。

尽管svndumpfilter十分有用,能节省大量的时间,但它却是把不折不扣的双刃剑。首先,这个工具对路径语义极为敏感。仔细检查转储文件中的路径是不是以斜线开头。也许Node-pathCopyfrom-path这两个头参数对你有些帮助。

…
Node-path: spreadsheet/Makefile
…

如果这些路径以斜线开头,那么你传递给svndumpfilter includesvndumpfilter exclude的路径也必须以斜线开头(反之亦然)。如果因为某些原因转储文件中的路径没有统一使用或不使用斜线开头,[14]也许需要修正这些路径,统一使用斜线开头或不使用斜线开头。

此外,复制操作生成的路径也会带来麻烦。Subversion支持在版本库中进行复制操作,也就是复制一个存在的路径,生成一个新的路径。问题是,svndumpfilter保留的某个文件或目录可能是由某个svndumpfilter排除的文件或目录复制而来的。也就是说,为了确保转储数据的完整性,svndumpfilter需要切断这些复制自被排除路径的文件与源文件的关系,还要将这些文件的内容以新建的方式添加到转储数据中。但是由于Subversion版本库转储文件格式中仅包含了修订版本的更改信息,因此源文件的内容基本上无法获得。如果你不能确定版本库中是否存在类似的情况,最好重新考虑一下到底保留/排除哪些路径。

####################################################################################

#svnadmin dump /svn/project3 > p3.dump

#cat p3.dump | svndumpfilter include NewBalance >NB.dump

#svnadmin craete /svn/NewBalance/

导入分支成为单独项目:

如果没有使用--bypass-prop-validation导入进去后目录就乱了。

# svnadmin load --bypass-prop-validation /svn/NewBalance < NB.dump

来自为知笔记(Wiz)

时间: 2024-10-22 17:02:45

SVN 迁移项目分支的相关文章

SVN管理项目分支思路和流程简单解释

假设 公司进行开发A项目,A项目分为PC端和WAP端,现在项目的第一个版本已经开发测试完毕,需要进行第二个版本的开发,以及第一个版本的维护. SVN服务器端目录结构如下 A // 项目根目录 branches    // 分支 V1    // 要进行维护的历史版本 pc     // 要进行维护的v1版本PC端 wap   //  要进行维护的v1版本WAP端 Vn   // 要进行维护的历史版本 pc     // 要进行维护的n版本PC端 wap     // 要进行维护的n版本WAP端

将代码库从 SVN 迁移至 Git 并保留所有 commit 记录

公司内部原本使用 SVN 进行版本控制,但随着 Github 的流行我个人的代码管理习惯逐渐转变.虽然公司项目并非开源,SVN 所具有的标准 trunk / branches / tags 结构完全够用,使用 Git 仍然有如下优势: 类似 GitHub 的 GitLab 免费管理工具.将代码托管在自己内部服务器上的同时,提供了优美的 web 界面,图形化分支结构,更直观的代码审查,统计.issue 系统.wiki 等功能全面集成. 更方便主程做 code review,控制代码质量.创建主仓库

坑死人不偿命,svn 迁移到 git

用git的人非常鄙视用svn的.因为要不断的开分支.而且也没有本地的分支这个概念. 但是git 作为一项技术,是一定可以被svn替代的.当然替代的方法是否繁琐另当别论,但一定是能被替代.svn同样也能被git替代.大概所有的技术都是一样.都能相互替代,只是你要为替代本身花费多长时间. git作为一种同步工具好用吗?其实真不好用.我梦想的工具一定是可以帮我自动完成merge过程的,永远不用开分支,永远不用告诉我链表头在哪里,以及怎么reset, 什么时候rebase, 什么时候打tag. 一个工具

SVN迁移到Git的过程(+ 一些技巧)

SVN迁移到Git的过程(+ 一些技巧) 李顺利 Key Words SVN,Git,Clone,Conversion,Tips,VCS,Pro Git 关于在VCS中SVN和Git之间的迁移(Clone)这个部分网上已经有大批的文章介绍,而且都非常不错,能够满足我们的常见的需求,这里介绍的是我自己整理的一些技巧和使用中出现的一些问题和疑问. 阅读本篇文章,请先有一些Git和SVN的使用经验(又是经验,经验到底是什么?我都不知道). 第一部分   今天的实验对象是,把 http://code.g

svn迁移到git

最近需要将项目从svn迁移到git,至于原因请忽略,至于svn与git区别优劣请自行百度.一共有两种方式可行: 第一种方式较为常见,但是会丢失之前svn版本提交记录,就是将svn checkout到本地然后上传到git上 详情参见:http://blog.csdn.net/hanhailong726188/article/details/46738929 第二种方式较为复杂,但是可以保留之前svn版本提交记录,执行命令如下: git svn clone https://172.16.0.241:

SVN迁移到Git的过程(+ 一些技巧

关于在VCS中SVN和Git之间的迁移(Clone)这个部分网上已经有大批的文章介绍,而且都非常不错,能够满足我们的常见的需求,这里介绍的是我自己整理的一些技巧和使用中出现的一些问题和疑问.阅读本篇文章,请先有一些Git和SVN的使用经验(又是经验,经验到底是什么?我都不知道).  第一部分 今天的实验对象是,把http://code.google.com/p/jdbcdslog-exp/ 这个使用SVN管理的project迁移到Git上面,Git托管网站选择github.SVN迁移到Git,当

两台电脑间的svn迁移

换电脑了,原机器上自己的svn资料不能丢掉,需要迁移到新的笔记本电脑上. 看了不少网友的迁移方法,大部分用的是svn本身提供的导入.导出的方法,我就想了如果svn所在的机器坏了怎么能正常的导出数据来??!!! 我就不按照svn标准做法干一下,看行不行. 下载VisualSVN-Server-3.3.1-x64.msi 并安装VisualSVN-Server-3.3.1-x64.msi,设置repositorys位置到E:\svn_abc\ 从老笔记本的svn repository中仅仅copy

将svn的项目从一台服务器转移到另外一台服务器

前几天在做一个项目的时候,因为需要,需要将Server A 上SVN仓库 repos1中的项目pro1迁移到Server B 上的SVN仓库中,首先想到的是:通过复制,但是仔细一想,这样是不可能的:然后想到的是先把项目pro1 checkout到本地,然后再 将本地的项目 import 到 ServerB的svn仓库中,但这样一来,ServerB上的SVN仓库中 就好比完全是一个新的pro1项目了,也就失去了svn管理的意义了.下面有一种方法可以解决: (在进行下面的操作时,请注意备份仓库数据,

SVN项目管理:分支库与合并库

上周接到PM大人的新任务,给主库做分支. 首先,先来看下SVN默认的三大文件夹,这三个文件夹建完库之后,一般默认会有,但是以前用的时候,还是比较简陋的,几乎都是大家提交到trunk里面,整个开发流程下来,一直用的是这个库. 那么,这三个文件夹都应该用来放什么东西呢? 分支(Branching) 分支起始的时候是主线的一个拷贝,但是其后他将保持独立性,拥有自己的变化. 有时你需要创建一个分支,例如你需要开发一个新功能,但是你又不希望新功能开 发完成之前影响主线的开发. 标记(Tagging) 标记