Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cvs到mercurial的转换得到错误的标记_Mercurial_Cvs_Tags - Fatal编程技术网

cvs到mercurial的转换得到错误的标记

cvs到mercurial的转换得到错误的标记,mercurial,cvs,tags,Mercurial,Cvs,Tags,我试了所有的方法 大多数情况下,他们都能获得最新版本的文件,但每一个都会破坏我的历史记录。当我运行“hg up$tag”时,cvs项目中的许多(大多数?)标记至少有一个文件出错 我的cvs回购协议并不那么复杂。为什么任何东西都不能转换它? 我想转储cvs并转换为mercurial,但不是没有历史 让我重述一下我的挫败感: 我尝试了hg转换 (已尝试--branchsort,--timesort,fuzz=0) 我尝试了cvs2svn,然后进行了hg转换 裁缝不适用于mercurial的最新版本

我试了所有的方法

大多数情况下,他们都能获得最新版本的文件,但每一个都会破坏我的历史记录。当我运行“hg up$tag”时,cvs项目中的许多(大多数?)标记至少有一个文件出错

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

让我重述一下我的挫败感:

我尝试了hg转换 (已尝试--branchsort,--timesort,fuzz=0)

我尝试了cvs2svn,然后进行了hg转换

裁缝不适用于mercurial的最新版本

从CVS中消失在地球表面

hg cvs导入已被放弃4年,不能与最新版本的hg一起使用


我试过使用mercurial的两个最新版本(1.5和1.5.1)。

马克,这是一个次优的解决方案,但当我所在的一家公司进行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级别的历史。

我找到了某种解决方案。我对它不感兴趣,但现在就必须这样了。 我能够检测出引起麻烦的标签,并从转换中省略这些标签。丢失的标记比错误的标记好得多(假设保留原始cvs repo以备备份)

警告:以下假设您已经制作了CVSROOT的副本并正在处理该副本。不要弄脏你的原稿

这是一个bash解决方案,适用于我的linux机器。它可能会烧毁你的房子,并邀请你的小学恶霸搬到你隔壁。你已经被警告过了

它使用CVSP来识别问题标签,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
CVSROOT=/path/to/your/copy
模块=CVS模块
rm-rf~/.cvsps~/.hg.cvsps#这个缓存是邪恶的!
BADTAGS=“`cvsps-q-x$MODULE | grep标签:| grep-e FUNKY-e无效| awk'{print$2}`”
而[!-z“$BADTAGS”];做
cd$CVSROOT/$MODULE
对于$BADTAGS中的badtag;做
echo删除标记$badtag
grep-lr$badtag.|xargs——如果为空则不运行-l1 rcs-q-n$badtag
grep-v“$badtag |$MODULE”<$CVSROOT/CVSROOT/history>$CVSROOT/CVSROOT/history_
mv$CVSROOT/CVSROOT/history_$CVSROOT/CVSROOT/history
完成
BADTAGS=“`cvsps-q-x$MODULE | grep标签:| grep-e FUNKY-e无效| awk'{print$2}`”
完成
rm-rf~/.cvsps~/.hg.cvsps#这个缓存是邪恶的!
mkdir~/hgcvt
cd~/hgcvt
cvs co$模块
hg转换$MODULE

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

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

在hg中,版本是变更集的别名。换言之,工作文件在某个快照时间的状态

区别是微妙的,但很重要

可以在cvs中对不及时表示快照的版本进行标记发布。这在hg中是不可能的

当然,可以应用补丁来获取副本。然而,这将在存储库上创建许多新的头,可以说没有什么好处(假设cvs回购协议仍然为后代保留)

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

我编写了以下脚本,以便在转换之前简单地咀嚼$CVSROOT中的所有cvs标记。e、 g标签“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()

她回来了。我正在我们的一个非常大的回购协议上进行测试,它速度非常快,可以处理增量转换。

当你做cvs2svn时,svn回购协议看起来还好吗?我相信是的。我对subversion(非)实现标记的无知有些限制。几次抽查表明tags/$TAG目录与cvs up-Ad-r$TAG的结果一致。我认为问题在于标签与文件的时间线顺序不符。e、 g.假设文件foo.cc的头版本在标记v250生成时还没有准备好,所以我通过“cvs up-r”提取并标记了一个较旧版本的foo.cc。CVSP似乎有很多问题,一旦您在hg中拥有了所有内容,您可以随时重新标记丢失的标记?您可以使用“rtag-d”通过cvs删除标记,而不是调用RCS。实际上是等效的,但是直接进入RCS并操作,v文件感觉是错误的。