代码之家  ›  专栏  ›  技术社区  ›  Mark Borgerding

cvs到mercurial的转换错误

  •  2
  • Mark Borgerding  · 技术社区  · 15 年前

    我试过所有的方法 recommended conversion techniques

    我的简历回购并不那么复杂。为什么任何东西都不能转换它? 我想扔掉简历,转换成mercurial,但不是没有历史。

    我试过了 汞转换

    我试过了 然后转换。

    不适用于mercurial的最新版本

    从地球表面消失了

    hg cvs导入 已经被废弃了4年,不能使用最新版本的hg

    4 回复  |  直到 15 年前
        1
  •  2
  •   Ry4an Brase    15 年前

    for thetag in $(cat LIST_OF_RELEASE_TAGS) ; do
       cvs update -r $thetag
       hg commit --addremove -m "snapshot $thetag" -u "import"
       hg tag $thetag
    done
    

    这假设了一个线性的标签链,但是我们只拉入了主/生产分支。更复杂的循环将在每次提交之前调用“hg update”,以获得反映CVS分支的父级。

    这绝对不是“完整的历史”,但它足以让我们感觉良好,继续在Mercurial没有失去我们的能力,说“到底是什么在版本1.1.11?!”我们可以随时回到cvs cvs blame 需要水平记录。

        2
  •  2
  •   Donnie    14 年前

    fromcvs 他回来了。我正在我们的一个非常大的回购上测试它,它非常快,可以处理增量转换。

        3
  •  1
  •   Mark Borgerding    15 年前

    我能够检测到引起麻烦的标签,并从转换中忽略这些标签。丢失的标签要比错误的标签好得多(假设原始的cvs repo是为了备份而保留的)

    警告:以下假设您已 复制

    这是一个bash解决方案,适用于我的linux系统。它可能会烧毁你的房子,并邀请你的小学欺负搬到你隔壁。你被警告了。

    它使用 CVSP公司

    CVSROOT=/path/to/your/copy
    MODULE=cvsmodule
    rm -rf ~/.cvsps ~/.hg.cvsps # this cache is EVIL!
    
    BADTAGS="`cvsps -q -x $MODULE |grep Tag: |grep -e FUNKY -e INVALID | awk '{print $2}' `"
    while [ ! -z "$BADTAGS" ];do
        cd $CVSROOT/$MODULE
        for badtag in $BADTAGS;do
          echo removing tag $badtag
          grep -lr $badtag . | xargs --no-run-if-empty -l1 rcs -q -n$badtag
          grep -v "$badtag|$MODULE" < $CVSROOT/CVSROOT/history > $CVSROOT/CVSROOT/history_
          mv $CVSROOT/CVSROOT/history_  $CVSROOT/CVSROOT/history
        done
        BADTAGS="`cvsps -q -x $MODULE |grep Tag: |grep -e FUNKY -e INVALID | awk '{print $2}' `"
    done
    rm -rf ~/.cvsps ~/.hg.cvsps # this cache is EVIL!
    mkdir ~/hgcvt
    cd ~/hgcvt
    cvs co $MODULE
    hg convert $MODULE
    
        4
  •  0
  •   Mark Borgerding    15 年前

    在cvs中,文件的一个版本具有与其不同版本相关联的标记。

    在hg中,版本是变更集的别名。换句话说 工作文件在某个时间点的状态

    区别是微妙的,但很重要。

    可以在cvs中生成一个不及时表示快照的版本的标记版本。这在hg中是不可能的。

    从cvs到mercurial的完美转换恐怕是不现实的。Ry4an的解决方案适用于那些只关心重新创建版本的人。我对源文件的历史和演变更感兴趣。

    #!/usr/bin/python
    import os
    import sys
    import stat
    
    def die(msg):
        sys.stderr.write(msg)
        sys.exit(1)
    
    cvsroot =os.getenv("CVSROOT")
    if cvsroot is None:
        die("CVSROOT not defined" )
    
    print "CVSROOT=%s" % cvsroot
    
    for rcsfile in os.popen("find %s -name '*,v'" % cvsroot).xreadlines():
        rcsfile = rcsfile.replace('\n','')
        print "rcsfile:%s" % rcsfile
        st=os.stat(rcsfile)
        if  st.st_mode & stat.S_IWUSR == 0:
            os.chmod(rcsfile,st.st_mode | stat.S_IWUSR)
    
        f = open(rcsfile,"r")
        inlines=f.readlines()
        f.close()
    
        outlines=[]
        insymbols=False
        symbolsDone=False
        for l in inlines:
            if insymbols and not symbolsDone:
                if l.find('\t') == 0:#tag line
                    l= l.replace(":","_prehg:",1)
                else:
                    symbolsDone=True
            else:
                if l == "symbols\n":
                    insymbols=True
            outlines.append(l)
    
        f = open(rcsfile,"w")
        f.writelines( outlines )
        f.close()