2010-04-02 59 views
2

我已經嘗試了所有的recommended conversion techniquesCVS含汞轉換都會標記錯誤

主要是他們設法獲取最新版本右邊的文件,但他們每一個象垃圾一樣清除我的歷史。從我的CVS項目中的變量的許多(大多數?)有錯誤至少一個文件當我運行「HG高達$標籤」

我的cvs回購是不是所有的複雜。爲什麼不能轉換它? 我想轉儲cvs並轉換爲mercurial,但不是沒有歷史。

總結一下我的無奈:

我試圖汞轉化 (試過--branchsort, - timesort,模糊= 0)

我試圖cvs2svn,然後汞轉化。

裁縫不與最新版本的善變

fromcvs從地球上消失的工作

HG-CVS-進口已經廢棄4年,不與

我一直在使用的水銀(1.5和1.5.1)最近的兩個版本試圖汞的最近版本。

+0

當你做cvs2svn的SVN回購看起來好嗎? – 2010-04-02 17:33:47

+0

我相信如此。我受到我對顛覆(非)標籤實施的無知的限制。一對夫婦抽查表明標籤/ $ TAG目錄與cvs的結果一致-Ad -r $ TAG。 – 2010-04-02 18:20:11

+0

我認爲這個問題與時間上與文件時間軸無序的標籤有關。 例如比如說foo.cc文件的HEAD版本沒有準備好,所以我通過'cvs up -r'取出並標記了foo.cc的舊版本。 cvsps似乎對這個 – 2010-04-02 19:06:21

回答

0

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

馬克,這是一個次優的解決方案,但是當一個公司我是做了一個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 blame級別的歷史是需要的。

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 
+0

有很多麻煩一旦你擁有了一切,那麼總是可以重新標記缺失的標籤? – 2010-04-03 08:46:13

+0

這不是標籤丟失。他們顯然是錯誤的。 – 2010-04-30 19:04:44

+0

而不是調用RCS,您可以使用「rtag -d」通過CVS刪除標記。相當於真的,但放入RCS並直接操作v文件感覺不對。 – olsner 2010-07-14 07:48:46

2

fromcvs又回來了。我正在對我們的一個非常大的回購庫進行測試,而且速度非常快,可以處理增量轉換。