我已经尝试了所有recommended conversion techniques
大多数情况下,他们设法正确获取最新版本的文件,但其中每一个都会破坏我的历史记录。当我运行“hg up $ tag”时,我的cvs项目中的许多(大多数?)标签至少有一个文件出错
我的cvs回购并不是那么复杂。为什么不能转换它? 我想转储cvs并转换为mercurial,但不是没有历史记录。
重温我的沮丧:
我尝试了 hg convert (试过--branchsort, - timesort,fuzz = 0)
我尝试了 cvs2svn 然后hg转换。
裁缝不适用于最新版本的mercurial
fromcvs 从地球上消失
hg-cvs-import 已被放弃4年,不适用于最新版本的hg
我尝试过使用两个最新版本的mercurial(1.5和1.5.1)。
答案 0 :(得分:2)
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分支的parentage。
这绝对不是“完整的历史”,但它足以让我们感觉良好的继续Mercurial而不会失去我们说“1.1.11版本到底是什么?”的能力。我们总是可以回到cvs,需要cvs blame
级别的历史记录。
答案 1 :(得分:2)
fromcvs回来了。我正在我们的一个非常大的回购中测试它,它非常快并且处理增量转换。
答案 2 :(得分: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
答案 3 :(得分:0)
我现在意识到cvs标签和hg标签之间存在某些基本的不兼容性。
在cvs中,文件版本的标签与其不同版本相关联。
在hg中,版本是变更集的别名。换句话说,某些快照的工作文件的状态
区别是微妙的,但很重要。
可以在不代表快照的版本的cvs中制作标记版本。这在hg中是不可能的。
当然,可以应用补丁来获取副本。然而,这将在存储库中创建许多新的头,可能带来的好处几乎没有(假设cvs repo仍然为子孙后代保留)。
我担心从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()