我現在意識到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