2017-09-16 41 views
1

我們公司已經決定從ClearCase的遷移我們的源代碼與git,這是偉大的:-)創建git的歷史,blob和樹對象,並行

我知道,ClearCase和git的是完全地不同的源代碼管理系統。 但是我們的開發者只會有一個包含完整歷史的SCM。

我collegue發現下面的工具,我們的進口ClearCase的歷史到混帳:https://github.com/charleso/git-cc

不幸的是我們的代碼有超過46000個的源代碼文件和歷史進口超過10年。

我分析了這個工具,在我看來有兩個瓶頸。 第一個是從clearcae服務器導入文件。這很容易通過多線程來解決。 第二個是git-cc本身的工作流程。

  1. 通過cleartool lshistory獲取主分支的歷史
  2. 創建文件和他們組的變更,以COMIT的
  3. 獲得來自呼叫控制服務器文件(S)的指定版本,並複製到工作目錄
  4. 混帳添加。
  5. git的承諾
  6. 挑選下一組和3再次啓動

我想我可以通過使用低級別的git命令,並使用多線程改善。

每個comit-group查詢它從服務器的變化並在git數據庫中創建一個blob對象,因此它可以運行多個線程中的多個組。 另外我有一個線程,從剛剛創建的blob對象創建git中的歷史記錄。

我的問題是現在,這對你有意義嗎?或者你認爲我是naiv?

我忘記了任何git鎖定機制嗎?

您有任何其他想法?

+0

通常爲了導入你使用[git-fast-import](https://git-scm.com/docs/git-fast-import)。我不知道它是否利用多個CPU(可能不是,因爲它將所有數據作爲單個二進制流),但至少它不會執行任何額外的IO。 – max630

+0

@ max630 嗨max630,謝謝你的回覆。這是避免任何額外I/O的好處。我會評估它。 – jungnick

回答

0

在Git倉庫的同一分支中使用多線程導入提交是有風險的(除非像你說的那樣創建「blob對象」,即可以重放的補丁)。

但是,在不同分支上使用多個線程進行提交是可能的:您創建不同的回購,每個回收分支導入,然後您可以將這些回收取回到一個常見回購庫中,並使用git replace or grafts重新附加回購。但是請記住:每個Git倉庫都是一個組件,所以如果你的巨大ClearCase Vob包含多個組件(文件組),最好將它們分成多個Git倉庫,而不是試圖創建一個巨大的Git倉庫組件。
我在「ClearCase to Git migration」中詳細說明。

+0

嗨VonC,感謝您的回覆。 我不知道爲什麼它應該有風險並行地創建blob對象? 並行導入提交顯然是非常危險的,因爲我想使用一個專用線程,從blob對象構建我的歷史記錄。 最後,我有n個線程閱讀我的clearcase歷史記錄,並創建懸空的blob對象和一個專用線程來構建我的歷史。 另一個團隊正在評估我們如何將我們的VOB結構遷移到多個更小的回購站。目前我們評估子模塊和子樹 – jungnick

+0

@jungnick我在這裏描述子模塊和子樹之間的區別:https://stackoverflow.com/a/31770147/6309。並給出一個子樹的例子:https://stackoverflow.com/a/24709789/6309。我更喜歡子模塊,因爲我可以參考歷史中的一個固定點,允許將父代回購克隆到已知狀態。 – VonC