使用svndumpfilter2在svn中将项目提取到独立的代码库(Python断言错误)
我正在尝试把一个项目从一个代码库迁移到自己的代码库,这样可以更方便地处理通过ldap的身份验证和授权。不过,在使用svnadmin dump | svndumpfilter --include ...的过程中,我遇到了一个常见的错误,提示说在包含的路径中有些文件是从不在该路径中的地方移动或复制过来的,因此这些内容无法使用。
我在网上查了一下,发现我需要使用一些svndumpfilter的Python脚本变种。我在Windows Server 2003上有Python 2.6.5,可以通过命令行访问。所有这三个脚本都使用标准输入,但它们的处理方式略有不同。svndumpfilter2可以启动,但在处理到第2个版本时就出错了,提示有一个断言失败。代码似乎期望那一行有一个冒号,但实际上没有。我使用的转储文件只是简单地通过svnadmin dump repo > out.dump生成的,没对它做过任何处理。
我使用的命令是:
svnadmin dump D:\svn\repo | C:\Python26\python.exe "C:\Program Files\CollabNet\Subversion Server\svndumpfilter2.py" http://localhost/svn/repo include Project > D:\svndump\project.dump
或者
svnadmin dump D:\svn\repo > out.dump
type out.dump | C:\Python26\python.exe "C:\Program Files\CollabNet\Subversion Server\svndumpfilter2.py" http://localhost/svn/repo include Project > D:\svndump\project.dump
我得到的输出是:
- 转储了版本 0。
- 转储了版本 1。C:\Program Files\CollabNet\Subversion
- Server\svndumpfilter2.py:67:
- 警告:md5模块已被弃用;请使用hashlib代替
- 导入md5时出错,追踪(最近的调用在最后):文件 "C:\Program Files\CollabNet\Subversion Server\svndumpfilter2.py",第406行,
- 在 lump = read_lump(fr) 中,文件 "C:\Program Files\CollabNet\Subversion Server\svndumpfilter2.py",第239行,
- 在 read_lump 中,lump = read_rfc822_headers(f) 文件 "C:\Program Files\CollabNet\Subversion Server\svndumpfilter2.py",第231行,
- 在 read_rfc822_headers 中,assert colon > 0 断言失败
它出错的转储文件的第一部分是:
SVN-fs-dump-format-version: 2
UUID: 880c8176-308d-ea4f-8680-45defe5ec145
版本号: 0 属性内容长度: 56 内容长度: 56
K 8 svn:date V 27 2007-01-30T21:25:29.487250Z 属性结束
版本号: 1 属性内容长度: 151 内容长度: 151
K 7 svn:log V 40 添加文件夹以允许正确分支。 K 10 svn:author V 15 COMPANY\USER K 8 svn:date V 27 2007-02-02T21:02:22.321625Z 属性结束
节点路径: branch 节点类型: dir 节点操作: add 属性内容长度: 10 内容长度: 10
属性结束
节点路径: tags 节点类型: dir 节点操作: add 属性内容长度: 10 内容长度: 10
属性结束
节点路径: trunk 节点类型: dir 节点操作: add 属性内容长度: 10 内容长度: 10
属性结束
版本号: 2 属性内容长度: 109 内容长度: 109
有没有人遇到过这个问题,或者知道为什么会发生这种情况?
1 个回答
这个错误可能是因为在Windows上运行Python时,它会对换行符进行转换(把标准输入当作文本文件处理)。
因为“svnadmin dump”生成的转储文件使用的是Unix的换行符格式(即使在Windows上运行也是如此),所以你不希望Python进行换行符的转换。解决办法是用“-u”选项来启动Python。
另外,svndumpfilter2.py的第一个参数应该是本地的REPOS_PATH,而不是一个http://的链接。假设你的仓库叫foo_bar,存放在c:\svnrepos\foo_bar。再假设你已经在foo_bar上运行过“svnadmin dump”,并生成了一个叫out.dump的文件。
那么正确的Python调用方式是:
C:\Python26\python.exe -u "C:\Program Files\CollabNet\Subversion Server\svndumpfilter2.py" c:\svnrepos\foo_bar Project D:\svndump\project.dump