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