颠覆加载失败,显示“没有这样的修订”

颠覆加载失败,显示“没有这样的修订”

我正在尝试学习如何迁移 Subversion 存储库,但遇到了一个对我来说毫无意义的问题。我曾经svndumpfilter拆分出一个子项目,并删除了一些路径前缀。现在数百个提交可以正确导入,但随后我收到以下错误:

<<< 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 是合并。在 19190 中,这是最后一个文件的信息,它似乎是导致问题的原因:

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!

我该怎么做才能加载这个文件?

谢谢!

答案1

我已经多次进行过这种拆分。我认为这完全取决于您如何使用过滤器以及之后对转储文件进行的处理。就我个人而言,我还必须更改 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

首先,我过滤掉我需要的内容,出于显而易见的原因,我删除了空的修订版本,然后对它们重新编号。这样可以得到有序的修订版本。然后,我删除了项目的根路径,在我的情况下,它是 group/customer 的形式,因为在新的 repo 中,这毫无意义(相反,repo 本身在磁盘上是 group/customer)——这是前 2 个 sed

接下来,我删除了未命名目录的导入,一个是上述 2 个 sed 生成的组目录,另一个是组/客户目录的添加。

最后,我让作者改成新的。这个也有点棘手,因为它需要更新属性定义的长度。

然后我加载它并修复文件系统权限。请注意 apache 的 2 个注释 chown,在某些情况下你会需要它。我最终将 apache 添加到 svn 组。

现在,我从未在 SVN 存储库中进行过合并,因此我从未处理过拆分。对于您的情况,我猜想会发生的情况是源修订路径未被导入,这就是为什么它找不到它,即使错误抱怨修订本身)。svn 导入文件中的经验法则是,在某一时刻引用的任何内容在被引用之前都必须已经导入。因此,您可能已经过滤掉了一些您不应该过滤的内容(即使您想要它),或者没有正确更新转储文件以反映您所做的任何其他更改。

如果你提供你原始仓库的相关结构,包括合并的源路径,以及带参数的调用,我可能能够告诉你你错过了什么。我的钱都花在合并的源头上。

答案2

我使用了一个很棒的工具svndumpsanitizer。问题在于 Subversion 存储库结构太复杂。当 svndumpfilter 处于修订版本 10 时,它无法知道用户想要丢弃的节点是否会被移动到修订版本 113 中他希望保留的位置。因此它只能做它能做的唯一一件事 - 它丢弃该节点,并且在修订版本 113 时失败,因为它已经丢弃了它本来需要的数据。

Svndumpsanitizer 的工作方式不同。它会多次扫描节点,以发现哪些节点应该保留。在确定要保留哪些节点后,它会将这些节点写入输出文件。最后 - 如果有必要 - 它会添加一个提交,删除任何必须保留的不需要的节点,以免破坏存储库。

相关内容