2009-12-01 66 views
6

我正在復活一個相當古老的代碼項目,從我定期使用CVS時起,作爲新項目中的一個組件,我已經致力於使用git。我仍然可以訪問舊項目模塊所在的CVS存檔,因此我只是要使用git-cvsimport來獲取提交歷史並從那裏開始。但是,這只是在當前的git倉庫中創建一個新的git倉庫。完全可能的是,我需要將其作爲一個多步驟流程來執行,在這個過程中,我將轉到CVS - >新鮮的git存儲庫,然後使用其他方法將其存入現有的git存儲庫。如何將現有的CVS模塊導入到現有git存儲庫的子目錄中

在取名爲NewProj/newsubdir運行這個($ CVSROOT已經正確地在我的shell配置設置):

git cvsimport -k -o master -u -s \- -A ~/Documents/cvs-authors.txt oldproj 

讓我一個全新的存儲庫取名爲NewProj/newsubdir/git的/所有正確提交的(評論,時間戳,歷史記錄)和HEAD在我想要的地方。

我想要的是歷史CVS承諾,就好像它們總是在newproj/newsubdir/oldproj-file1,newproj/newsubdir/oldproj-file2等等。以我的經驗,git有這樣做的魔力有些事情,但我找不到適合我的情況。

回答

0

想通了怎麼辦我基於this answer for combining git repositories想要什麼,使用Git濾波器分支,使其彷彿從CVS導入的模塊已被直接合併到現有的git倉庫

從開始所需的子目錄含取名爲NewProj目錄,現有的Git倉庫:

% git cvsimport -k -u -s \- -A ~/Documents/cvs-authors.txt \ 
    -C newproj-sibling oldproj 
% cd newproj-sibling 
% git filter-branch --index-filter \ 
    'git ls-files -s | gsed "s-\t-&subdir/of/newproj/-" | 
    GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ 
    git update-index --index-info && 
    mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD 
% cd ../newproj 
% git pull ../newproj-sibling master 

假設在Git倉庫的目標子目錄是全新的,或者至少載有與CVS的模塊共享名沒有文件,合併應熄滅順利。

一個警告:我上面已經說過了,因爲OS X附帶的BSD sed不能像\ t那樣進行字符轉義,而且我還沒有打擾過別名。

2

您有三種選擇。他們都從乾淨的cvsimport開始,所以繼續做下去。

  1. 引用repo作爲子模塊。
  2. 將回購獲取到現有的回購中,並執行子樹合併以加入歷史。
  3. 做一些類似於#3的事情,然後重新安裝樹,以按時間順序交織整個歷史中的提交。

頭號意味着外部項目依賴於內部,但可能不適合你。

第二個在這個subtree merge howto解釋。這對你來說可能已經足夠了。


,如果你喜歡一個乾淨的線性的歷史,你可以做#3纏起來爲好。我在清理項目中做了something similar,並且還有大量的文檔和工具。

基本的想法是將所有的變化分離成一個補丁歷史記錄,以重建這些變化。默認情況下,這個歷史記錄是以某種存儲庫順序存儲的,但是運行我在文章中提到的腳本將按照時間順序將這些補丁重新排列成一個新的序列。

樹散列應該讓你知道你沒有打破沿襲以外的任何東西。

如果我再次這樣做,我可能會發射移植文件並執行filter-branch

+0

噢,你回答我是在回答自己。詛咒我的急躁! – UltraNurd 2009-12-02 04:39:39

相關問題