我试图学习如何迁移一个Subversion的回购,并且遇到了一个对我来说毫无意义的问题。 我已经使用svndumpfilter拆分出一个子项目,并删除了一些path前缀。 现在几百个提交正确导入,但是我得到以下错误:
<<< Started new transaction, based on original revision 19190 * editing path : branches/features/DynamicSource ... done. * editing path : branches/features/DynamicSource/src/build.properties ... done. * editing path : branches/features/DynamicSource/src/client/default.htm ...done. * editing path : branches/features/DynamicSource/src/client/js/AdHocController.js ... done. * editing path : branches/features/DynamicSource/src/client/js/Report.js ... done. svnadmin: E160006: No such revision 19098 * adding path : branches/features/DynamicSource/src/client/js/Enums.js ...
好的,所以我进入转储文件查看修订版19190和19098.首先,转储文件中存在修订版19098 ,并且导入没有问题。 19190修订版是一个合并。 在1919年,这是最后一个文件的信息,这似乎是造成这个问题:
Node-copyfrom-rev: 19100 Node-copyfrom-path: trunk/src/client/js/Enums.js Text-copy-source-md5: 2db7f8d9c0ba4750d88ce0722731aad6 Node-path: branches/features/DynamicSource/src/client/js/Enums.js Node-action: add Text-copy-source-sha1: 8f930509f8dbc17c5e82cd40aa5a76454d3d812c Node-kind: file Content-length: 0
令人困惑的是,在这个过滤的文件中不存在19100版本。 但是这个错误不是指19100,而是指的是19098年!
我该如何获得这个文件加载?
谢谢!
我做了很多次这样的分裂。 我想这一切都取决于你如何使用filter,以及你在转储文件之后做了什么处理。 就我个人而言,我还必须更改项目path旁边的svn用户,并重新编号修订。 就这样你可以看到可以做什么,这里是我的脚本的相关部分。
grp=$cust_group usr=$cust_customer svndumpfilter include $grp/$usr --drop-empty-revs --renumber-revs <$repo_dump > $repo_dump.$usr sed -e "s/Node-path: $grp\/$usr/Node-path: /" <$repo_dump.$usr >$repo_dump.$usr.fixed1 sed -e "s/Node-copyfrom-path: $grp\/$usr/Node-copyfrom-path: /" <$repo_dump.$usr.fixed1 >$repo_dump.$usr.fixed2 sed -e "/Node-path: /{ N; N; N; N; N; N; s/Node-path: \nNode-action: add\nNode-kind: dir\nProp-content-length: 10\nContent-length: 10\n\nPROPS-END//}" <$repo_dump.$usr.fixed2 >$repo_dump.$usr.fixed3 sed -e "/svn:author/{ N; N; s/svn:author\n.*\n$svn_usr_from/svn:author\nV $svn_usr_len\n$svn_usr_to/}" <$repo_dump.$usr.fixed3 >$repo_dump.$usr.fixed4 svnadmin load $repo_dir/$cust_group/$cust_customer --ignore-uuid < $repo_dump.$usr.fixed4 chown svn:svn -R $repo_dir/$cust_group/$cust_customer #chown apache $repo_dir/$cust_group/$cust_customer/db/txn-current #chown apache $repo_dir/$cust_group/$cust_customer/db/current # apache is in svn group so the above 2 are not needed chmod -R g+rw $repo_dir/$cust_group/$cust_customer
发生什么事首先,我筛选出我需要的东西,我明显的原因放弃了空白的修改,然后重新编号。 这给了很好的有序的修订。 然后,我放弃项目的根path,在我的情况是在组/客户的forms,因为在新的回购没有意义(而不是回购本身是磁盘组/客户) – 这是第一个2 sed
接下来,我删除了非命名目录的导入,其中一个是针对组目录的两个sed,另一个是针对group / customer目录的添加。
最后,我让作者改了一个新的。 这个也有点棘手,因为它需要更新属性定义的长度。
然后我加载它并修复文件系统权限。 注意apache的2个注释,在某些情况下,你将需要它。 我最终结束了向svn组添加apache。
现在,我从来没有合并SVN回购,所以我从来没有处理他们的分裂。 在你的情况下,我会想象会发生什么是源版本path不被导入,这就是为什么它没有find它,即使错误抱怨在版本本身)。 在svn导入文件中的经验法则是,任何在一个点上引用的内容必须在被引用之前已经被导入。 所以你可能已经过滤掉了你不应该的东西,即使你想要它,或者没有正确地更新转储文件来反映你所做的其他更改。
如果您提供了原始回购的相关结构,包括合并后的源代码path,再加上带有参数的呼叫,我可能会告诉您您错过了什么。 我的钱是合并的来源。
我已经使用了一个伟大的工具svndumpsanitizer 。 问题是Subversion版本库结构太复杂了。 当svndumpfilter处于修订版本10时,无法知道用户想要丢弃的节点是否会被移动到他希望保留在修订版本113中的位置。因此,它唯一可以做的事情是放弃节点,并在修订113胡说,因为它已经丢弃了它所需要的数据。
Svndumpsanitizer以不同的方式工作。 它多次扫描节点,以发现哪些节点实际上应该保持。 在确定要保留哪些节点之后,只将这些节点写入outfile。 最后,如果有必要,它会添加一个提交,删除必须保留的不需要的节点,以免破坏存储库。