[英]How do I import an existing CVS module into a subdirectory of an existing git repository
我正在復制一個相當古老的代碼項目,從我定期使用CVS開始,作為我已經在使用git工作的新項目中的一個組件。 我仍然可以訪問舊項目模塊所在的CVS存檔,所以我只是使用git-cvsimport來獲取提交歷史記錄並從那里開始。 但是,這只是在當前的一個內部創建一個新的git存儲庫。 完全有可能我需要這樣做一個多步驟的過程,我去CVS - >新的git存儲庫,然后使用其他東西將它帶入現有的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有做這種事情的魔力,但我找不到明顯適合我的情況。
你有三個選擇。 所有這些都從干凈的cvsimport開始,所以繼續這樣做。
第一意味着外部項目依賴於內部,但可能不適合您。
在這個子樹合並howto中解釋了第二個。 這對你來說可能已經足夠了。
但是如果你喜歡干凈的線性歷史,你可以做#3並將它們整理好。 我在一個清理項目中做了類似的事情 ,並且還有很多文檔和工具。
基本思想是將所有更改分離為可重建更改的修補程序歷史記錄。 默認情況下,此歷史記錄采用某種存儲庫順序,但運行我在帖子中提到的腳本將按時間順序將修補程序重新排列為新序列。
樹形哈希應該讓你知道你沒有破壞除了血統以外的任何東西。
如果我再次這樣做,我可能只是發出一個移植文件並做一個filter-branch
。
根據這個組合git存儲庫的答案找出如何做我想做的事情,使用git filter-branch使其好像從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那樣進行字符轉義,我還沒有打擾別名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.