将PuTTY的svn存储库转换为mercurial存储库

3
我将管理一个mercurial中的韩文本地化版本PuTTY。
对mercurial存储库的要求:
- 我们应该能够跟踪PuTTY svn存储库的最新修订版本。 - 不需要推送。
我的计划是在mercurial存储库中使用原始trunk和分支作为命名分支,并添加自己的分支。我将使用hgsubversion进行初始转换后的持续拉取。
问题是,PuTTY存储库(http://svn.tartarus.org/sgt/)不符合标准布局,而且包含其他项目。DVCS转换工具适用于标准布局存储库,但不适用于非标准存储库。
因此,我必须映射目录以使其“标准”,如下所示:
- /putty => /trunk - /putty-0.xx => /tags/0.xx - /putty-branch-0.xx => /branches/0.xx - 忽略所有其他目录
如果trunk具有发布所需的每个修订版本,则仅转换trunk即可。但不幸的是,版本0.62是在putty-branch-0.61分支上发布的!所以我无法获取它的最新修订版本。:(
我正在尝试使用svnsync、svnadmin dump和svndumpfilter在mercurial转换之前将原始svn存储库转换为标准格式,但无法使用它们手动映射所需的目录。 (或者也许我不知道如何使用它们。)
有什么建议和评论吗?
2个回答

1

我查看了代码库。你说得对,svndumpfilter无法在整个历史记录中重命名文件,因此我编写了一个小脚本,在转储文件中进行重命名。唯一棘手的部分是添加tagsbranches文件夹的创建。要使用该脚本,您应该创建一个cronjob或类似的东西:

  1. 下载最新的Putty SVN转储文件

    $ wget http://www.chiark.greenend.org.uk/~sgtatham/putty/putty-svn.dump.gz
    
  2. 使用脚本修复转储文件:

    $ zcat putty-svn.dump.gz | fix-dump.py > fixed.dump
    
  3. 将其加载到一个新的空仓库中:

    $ svnadmin create putty
    $ svnadmin load putty < fixed.dump
    
  4. 将Subversion仓库转换为Mercurial仓库:

    $ hg convert file://$PWD/putty

就我所看到的,分支和标签都已经正确创建了。

您要求进行持续拉取(增量转换)。幸运的是,hg converthgsubversion 都支持此功能。在将变更集转换为 Mercurial 之前,您需要每天重新执行步骤 1-3。这将起作用,因为前三个步骤是确定性的。这意味着您的 putty SVN 存储库表现得好像 Putty 开发人员直接在其中使用您维护的正确分支和标记名称。

以下是脚本:

#!/usr/bin/python
import sys, re moves = [(r"^Node(-copyfrom|)?-path: %s" % pattern, r"Node\1-path: %s" % repl) for (pattern, repl) in [(r"putty-branch-(0\...)", r"branches/\2"), (r"putty-(0\...)", r"tags/\2"), (r"putty(/|\n)", r"trunk\2")]]
empty_dir_template = """\ Node-path: %s Node-kind: dir Node-action: add Prop-content-length: 10 Content-length: 10
PROPS-END\n\n"""
created_dirs = False for line in sys.stdin: if not created_dirs and line == "Node-path: putty\n": sys.stdout.write(empty_dir_template % "tags") sys.stdout.write(empty_dir_template % "branches") created_dirs = True for pattern, repl in moves: line, count = re.subn(pattern, repl, line, 1) if count > 0: break sys.stdout.write(line)

0

我已决定只跟踪发布的源代码,而不是每个修订版。

结果在这里:https://bitbucket.org/daybreaker/iputty/changesets

为了做到这一点,我遵循了以下步骤(例如):

svn ls -R svn://svn.tartarus.org/sgt/putty-0.58 > 58.txt
svn ls -R svn://svn.tartarus.org/sgt/putty-0.59 > 59.txt
svn ls -R svn://svn.tartarus.org/sgt/putty-0.60 > 60.txt
svn ls -R svn://svn.tartarus.org/sgt/putty-0.61 > 61.txt
svn ls -R svn://svn.tartarus.org/sgt/putty-0.62 > 62.txt

hg init iputty
cd iputty
svn export --force svn://svn.tartarus.org/sgt/putty-0.58 .
hg branch original
hg add
hg commit -m 'Imported PuTTY 0.58 release.'
svn export --force svn://svn.tartarus.org/sgt/putty-0.59 .
diff -U3 ../58.txt ../59.txt
hg add (added files from diff)
hg rm (removed files from diff)
hg commit -m 'Imported PuTTY 0.59 release.'
(repeat this for the remaining releases)

hg up -r(rev# of 0.60 release)
svn export --force (URL of my own modified PuTTY repository) .
hg branch default
hg commit -m 'Imported the most recent dPuTTY source code. blah blah'

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