2010-04-02 65 views
2

我已经尝试了所有的recommended conversion techniquesCVS含汞转换都会标记错误

主要是他们设法获取最新版本右边的文件,但他们每一个象垃圾一样清除我的历史。从我的CVS项目中的变量的许多(大多数?)有错误至少一个文件当我运行“HG高达$标签”

我的cvs回购是不是所有的复杂。为什么不能转换它? 我想转储cvs并转换为mercurial,但不是没有历史。

总结一下我的无奈:

我试图汞转化 (试过--branchsort, - timesort,模糊= 0)

我试图cvs2svn,然后汞转化。

裁缝不与最新版本的善变

fromcvs从地球上消失的工作

HG-CVS-进口已经废弃4年,不与

我一直在使用的水银(1.5和1.5.1)最近的两个版本试图汞的最近版本。

+0

当你做cvs2svn的SVN回购看起来好吗? – 2010-04-02 17:33:47

+0

我相信如此。我受到我对颠覆(非)标签实施的无知的限制。一对夫妇抽查表明标签/ $ TAG目录与cvs的结果一致-Ad -r $ TAG。 – 2010-04-02 18:20:11

+0

我认为这个问题与时间上与文件时间轴无序的标签有关。 例如比如说foo.cc文件的HEAD版本没有准备好,所以我通过'cvs up -r'取出并标记了foo.cc的旧版本。 cvsps似乎对这个 – 2010-04-02 19:06:21

回答

0

我现在意识到cvs标签和hg标签之间存在某些基本的不兼容性。

在CVS中,文件的版本具有与其不同版本相关联的标签。

在hg中,版本是变更集的别名。换句话说工作文件的状态在一些快照时间

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

可以在不能及时表示快照的版本的cvs中制作标签发布。这在hg中是不可能的。

当然可以使用补丁来获取副本。但是,这会在存储库上创造出很多新的元首,并且没有什么好处(假设cvs回购仍然留在子孙后代)。

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

我写了下面的脚本来简单地在转换之前将$ CVSROOT中的所有cvs标签嵌入其中。例如标签“v321”变为“v321_prehg”。这样开发人员就会知道这些标签不是权威的,他们必须回到只读的CVS树。

#!/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() 
2

马克,这是一个次优的解决方案,但是当一个公司我是做了一个CVS-> Mercurial的迁移,我们决定,我们所关心的是标签快照,所以我们建立了一个有点像循环:

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级别的历史是需要的。

1

我发现了各种各样的解决方案。我对此并不感到激动,但现在必须要做。 我能够从转换检测中造成麻烦的标签和省略这些标签。缺失标签比错误标签要好得多(假设原始cvs repo保留备份)

警告:以下内容假定您已制作了一个拷贝的CVSROOT,并正在处理该问题。不要与你的原创。

这是一个bash的解决方案,为我的作品在我的Linux机器。它可能会烧毁你的房子,并邀请你的小学生欺负你隔壁。你已被警告。

它采用cvsps找出问题的标签,RCS将其删除,然后从CVSROOT /历史删除标签。除去cvsps缓存后,hg转换按预期工作。

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 
+0

有很多麻烦一旦你拥有了一切,那么总是可以重新标记缺失的标签? – 2010-04-03 08:46:13

+0

这不是标签丢失。他们显然是错误的。 – 2010-04-30 19:04:44

+0

而不是调用RCS,您可以使用“rtag -d”通过CVS删除标记。相当于真的,但放入RCS并直接操作v文件感觉不对。 – olsner 2010-07-14 07:48:46

2

fromcvs又回来了。我正在对我们的一个非常大的回购库进行测试,而且速度非常快,可以处理增量转换。