我现在意识到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()
当你做cvs2svn的SVN回购看起来好吗? – 2010-04-02 17:33:47
我相信如此。我受到我对颠覆(非)标签实施的无知的限制。一对夫妇抽查表明标签/ $ TAG目录与cvs的结果一致-Ad -r $ TAG。 – 2010-04-02 18:20:11
我认为这个问题与时间上与文件时间轴无序的标签有关。 例如比如说foo.cc文件的HEAD版本没有准备好,所以我通过'cvs up -r'取出并标记了foo.cc的旧版本。 cvsps似乎对这个 – 2010-04-02 19:06:21