我想把Subversion代码库中的一个子目录(这里用module
表示)转换为带有完整历史记录的git代码库。在我的Subversion代码库历史记录中,有许多svn copy
操作(Subversion用户称之为分支)。发布策略是,在每次发布或其他创建分支后,旧URL将不再使用,新URL将替换旧URL以包含工作内容。
通过我的阅读,最理想的情况似乎是这样做:
$ git svn clone --username=mysvnusername --authors-file=authors.txt \
--follow-parent \
http://svnserver/svn/src/branches/x/y/apps/module module
(其中branches/x/y/
代表最新的分支)。但是我遇到了一个错误,看起来像这样:
W: Ignoring error from SVN, path probably does not exist: (160013): Filesystem has no item: '/svn/src/!svn/bc/100/branches/x/y/apps/module' path not found
W: Do not be alarmed at the above message git-svn is just searching aggressively for old history.
(更新: 添加选项--no-minimize-url
并不能消除错误信息。)
目录module
被创建和填充,但最新的svn copy
提交以后的Subversion历史记录没有被导入(创建的git仓库最终只有两个提交,而我预期的是数百个提交)。
问题是,如何在这种情况下导出完整的Subversion历史记录?
可能的原因
搜索错误信息时,我发现了这个帖子:git-svn anonymous checkout fails with -s,其中链接到了这个Subversion问题:http://subversion.tigris.org/issues/show_bug.cgi?id=3242
根据我的阅读,Subversion 1.5中的某些内容改变了客户端访问存储库的方式。使用更新版本的Subversion,如果URL路径的某个上一级目录没有读取访问权限(对我来说是真实的,
svn ls http://svnserver/svn
失败并显示403 Forbidden
),则会在某些Subversion操作中失败。Jeff Fairley在他的回答中指出,Subversion URL中的空格也可能导致此错误消息(由用户Owen确认)。查看他的解决方案,以了解如何解决因相同原因而导致
git svn clone
失败的情况。Dejay Clayton在他的回答中揭示,如果分支和标记svn url中最深层子目录组件的名称相同(例如
.../tags/release/1.0.0
和.../branches/release-candidates/1.0.0
),则可能会出现此错误。