Git-svn/hgsubversion克隆重命名项目

3
我有一个SVN项目,想要克隆到Git或Mercurial。克隆到两个版本控制系统都没问题,但是有一个主要问题——始终只获得最后一个修订版本,没有任何其他历史记录。
我可以清楚地看到问题的根源在于SVN项目最近被改名(改名是最后一个修订版本,是我唯一能获取到的版本)。使用SVN,我可以看到项目背后的所有历史记录,没有任何问题。
最奇怪的事情是,当我使用git-svn clone命令时,我可以看到它通过大量的修订版本,导入它们,但最终我仍然只得到一个版本。Mercurial则是反向工作,不像Git那样,它只取最后一个修订版本并完成克隆。
还要注意的是,这最后一个SVN项目重命名/移动并不是唯一的。之前至少有两次重命名,我确实需要完整的项目历史记录,就像使用SVN看到的那样。

什么是“项目重命名”?我不知道如何在SVN术语中翻译它。根文件夹重命名了吗?您可以仅克隆一小部分修订版本,稍后再拉取其他版本,并对于更改的路径,使用--filemap将旧位置和新位置映射到一个永久位置。 - Lazy Badger
是的,那就是我的意思——项目的根目录被重命名了。--filemap不是只有Mercurial Convert扩展使用吗?Convert对我来说并不理想,它不像hgsubversion那样灵活。我需要继续使用SVN,而不仅仅是将SVN存储库转换为Mercurial。此外,问题就在这里——我无法克隆除最后一个之外的任何修订版。即使我指定其他修订版。 - NeverwinterMoon
  1. 在使用"外部"存储库进行克隆时,可以在hg clone中使用文件映射和其他*映射。
  2. 您可以尝试在克隆旧路径的URL中使用PEG修订。
- Lazy Badger
我尝试使用旧路径并使用@REV_NO指定修订版本,但出于某种原因,hg表示它无法在该位置找到任何内容。虽然我可以使用SVN浏览同一位置。 - NeverwinterMoon
2个回答

0

想法

  • 由于使用 PEG 修订无法克隆不存在的 svn-URL

    hg clone http://mayorat.ursinecorner.ru:8088/svn/Hello/branches/Greetings@16

    abort: HTTP Error 404: Not Found

即使

svn ls http://mayorat.ursinecorner.ru:8088/svn/Hello/branches/Greetings@16
Hello.txt

你可以尝试克隆仓库,使用父目录或重命名后的目录作为根目录。你会得到很多无关的同级路径变更集,但是(如果重命名是公平的svn move),我希望,所有与所需路径相关的变更集都在仓库中:你只需要清理历史记录。

  • 分割和合并

转储SVN仓库,使用svndumpfilter将其拆分为单独的转储(每个更改的目录名称一个转储),将转储加载到单独的svn仓库中,将每个svn仓库克隆到自己的Mercurial仓库中(仓库不能有多个子版本来源),将仓库拉入共同的仓库,修复历史记录。


是的,关于克隆父文件夹的想法很简单但不错。我刚试过了。可悲的是,hg总是在某个修订版本上出现“无法读取块大小”的错误。另一方面,Git做同样的事情很好(尽管通常速度非常慢)。感谢您的耐心等待。如果您有其他想法,请随时添加 :) - NeverwinterMoon

0

对于mercurial,我看到了this guide可能会有所帮助。右侧还有足够多关于git-svn的其他问题可以解决你的问题。

我假设你已经看到了this,这是由Parrot项目制作的git-svn教程。进一步来说,你需要在git log之后进行git rebase,以确定你想要使用的修订哈希码。如前所述,如果你需要更多信息,请留言。


你链接的Mercurial指南是我开始尝试使用hgsubversion时查看的第一件事。它描述了Hg-SVN桥接的基本过程。正如我所说,我可以创建这个桥接。只是我无法获得所有的SVN历史记录,并且有一个具体的原因。该指南没有提到这一点。至于git-svn,我只找到了一个与我处境相同的问题,但它对我并没有太大用处。 - NeverwinterMoon
嗯,是的,我唯一能想到的方法就是在每次重命名之前克隆修订范围,然后合并它们。我尝试过从旧版本克隆旧存储库,像这样 git svn clone -r 1:2 /path/to/svn@2,但它没有起作用... - NeverwinterMoon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接