2011-12-24 84 views
3

我将在mercurial中管理韩文本地化版本的PuTTY。将PuTTY的svn仓库转换为mercurial repository

的Mercurial库的要求:

  • 我们应该能够追踪从腻子SVN库中的最新修订版。
  • 不需要推动。

我的计划是将原始主干和分支作为命名分支在mercurial存储库中,并添加我自己的分支。 我打算使用hgsubversion进行初始转换后的连续提取。

问题是,腻子库(http://svn.tartarus.org/sgt/)是不是在标准布局,更糟糕的是,包含其他项目也。 DVCS转换工具适用于标准布局存储库,但不适用于非标准布局存储库。

所以我要地图目录,使其 “标准”,如:

  • /putty =>/trunk
  • /putty-0.xx =>/tags/0.xx
  • /putty-branch-0.xx =>/branches/0.xx
  • 忽略所有其他目录

如果中继线有版本要求的每个版本,只转换中继线就没问题。 但不幸的是,版本0.62在putty-branch-0.61分支发布!所以我无法得到它的最新修订。 :(

我试图使用svnsyncsvnadmin dumpsvndumpfilter转换善变转换前的原svn库的标准,但手动映射的目录,我想是不可能与他们(或者我不知道如何与他们做)

任何建议和意见

回答

1

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

  1. 下载latest Putty SVN dump file

    $ 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. 版本库转换为Mercurial库:

    $汞柱转换文件:// $ PWD /腻子

据我所看到的,是正确创建分支和标签。

你问连续拉(增量转换)。幸运的是,hg converthgsubversion都支持这一点。您需要每天重做步骤1-3,然后才能将变更集转换为Mercurial。这将起作用,因为前三个步骤是确定性的。这意味着您的SVN存储库的行为就好像腻子开发人员使用您在其中维护的正确分支和标记名称直接在其中工作。

下面的脚本是:

 
#!/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'