2016-05-06 89 views
0

我正在從cvs遷移到git。 (Scoff如果你願意,但只有當你的公司已經存在了15年。)從cvs遷移到git時將稀疏標記合併到分支

我有一些舊時代的CVS標籤,只在回購中標記了一些文件,不是全部。當我查看這些標籤時,它看起來像一個沒有標記的東西已被刪除的回購。這在cvs/svn和git之間的分支模型中是衆所周知的差異。

我想提出一個新的分支這樣的:

  • 開始與我的主分支,並作出新的版本分支。
  • 只替換標記爲tags/A的文件。
  • 然後最重要的是,只替換標記爲tags/B的文件。
  • 然後提交一大堆。

理想情況下,新分支將包含標記文件的舊歷史以及主分支。

有沒有很好的方法來做到這一點?

+0

我從來沒有這樣做過,但我首先看到'cvs2 *'(以cvs2git開頭)與他們做了什麼。如果一切都失敗了,只需手工完成:用cvs2git轉換大部分存儲庫,然後創建一些特殊情況項目,並使用filter-branch和/或graft/replace將它們楔入。這隻有在您有一小部分,否則你可能需要自動化。 – torek

回答

1

你是否可以在CVS中爲CVS編寫cvs repo for cvs2git腳本之後做到這一點?瀏覽所有標籤並將缺少的文件添加到標籤。 cvs tag自己,沒有-F不會移動標籤。因此,您可以基於標記/ B重新應用標記/ A,並且僅將其應用於尚未標記的文件,這正是您想要的。

這可能會證明你只是有太多的標籤來實現這一點。我在想20,000個標籤x 5分鐘/標籤= 34天。

但我不知道在git中做它會快很多。一旦你在git中,你將不得不清理所有的cvs2git構件:fixup提交等與每個標籤關聯。但我可以想象,在理論上,逐步遍歷每個標記,檢出更多文件,添加它們,修改提交(通過適當的GIT_環境變量保留作者和日期),移動標記,將它與先前的提交進行比較實際上在分支上,以便您可以將標籤移回標籤。

另外,您的標籤位於他們應該在的指定分支上對您來說很重要嗎?因爲所有那些fixup提交他們不會,即使你的修正。確保您的master分支以最優雅和最有意義的方式進行轉換,同時讓一些較舊的分支有點脆弱,這可能是務實的做法。

更新

只是一個瘋狂的想法。做cvs2svn,修理標籤,然後svn2git是否有意義?我知道這聽起來有點瘋狂,但是Subversion有git的變化,但是能夠像cvs一樣逐個文件地工作,所以它可能是修復標籤的最佳位置。

1
git checkout -b release master 
git merge --no-commit -s ours tags/A tags/B 
git checkout tags/A -- . 
git checkout tags/B -- . 

git commit # put the above sequence in the commit message if you have love in your heart 

第一個命令是「簽出當前主文件夾,但是作爲新分支名爲release:」。

第二個是「設置但不提交從標籤/ A和標籤/ B的無操作合併」。在提交之前,你可以安排你想要的任何合併結果。

...特別是,第三個和第四個命令加載這兩個提交中的內容的版本。

+0

也許如果他想修復'tags/A',那麼配方中的git checkout可以是'git checkout -b fixA tags/A〜'。新提交將在與'tags/A'相同的父代之上創建。然後可以將'tags/A'移動到'fixA'(或者如果結果是相同的話,甚至可以使用'fixA〜')。 (同樣,對於提交,您將需要設置各種GIT_AUTHOR等環境變量,以使它與原始標籤/ A具有相同的作者/提交者/日期。) – Mort