2011-05-25 106 views
16

我有許多項目在單獨的Git存儲庫中。他們同樣也在單獨的eclipse項目中(因爲m2插件中的錯誤導致我無法長時間使用Maven插件使用父項目)。現在可以工作了。如何將Git項目遷移爲包含子項目的一個項目

因此,我將Maven中的項目合併爲一個基礎POM項目,並將其作爲其他項目的父項。然後我嵌套子項目。

當我將基礎項目提交爲git項目時,它已經決定子目錄是子模塊,即使根目錄中沒有.gitmodules文件。

看起來,要完成這項工作的唯一方法就是丟失正在合併的項目中的所有歷史記錄。

只是要超清晰,目前有:

Project A (repo A) 
Project B (repo B) 
Project C (repo C) 

我要的是:

New Base Project D (repo D) 
    /Project A 
    /Project B 
    /Project C 

我寧願不丟失任何歷史,但如果我必須這樣做,我想我可以閣樓之前的版本。我不認爲我需要子模塊,因爲這些模塊似乎適用於包含不受您控制的遠程回購。

將解決方案轉換爲bash腳本。它假設你想添加的子目錄位於與父目錄相同級別的子目錄中。那就是:

#! /bin/bash 
git remote add -f $1 ../$1 
git merge -s ours --no-commit $1/master 
git read-tree --prefix=$1 -u $1/master 
git commit -m "Added project $1" 

Git是驚人的..

回答

11

你可以做一種叫做「子樹合併」到將多個存儲庫合併爲一個。讓我們假設要合併~/projects/alpha~/projects/beta到一個新的項目,~/projects/multi

$ cd ~/projects/multi 
$ git init 

合併在「阿爾法」項目......

$ git remote add -f alpha ~/projects/alpha 
$ git merge -s ours --no-commit alpha/master 
$ git read-tree --prefix=alpha -u alpha/master 
$ git commit -m "Added project alpha" 

合併在「試用」項目以同樣的方式。如果更改是永久性的,那麼您可以刪除新項目中的alpha遠程。如果在alpha回購中仍然有發展,那麼你不僅可以保留歷史,還可以引入新的變化。

所有歷史記錄仍然存在,項目將位於子目錄中。我在家用電腦上使用了這個「死亡項目庫」 - 一個包含我曾經工作過的一切的大規模git倉庫,要麼被放棄,要麼沒有足夠大的空間來存放它自己的倉庫。

+0

這看起來像一個很好的解決方案,會嘗試今晚。謝謝。 – Rob 2011-05-25 01:17:26

+0

不錯,剛完成前2個項目就完成了。看起來很棒。謝謝。 – Rob 2011-05-25 02:20:57

+0

Hi Dietrich?自遷移以來,首次嘗試並在其中一個文件上進行了git登錄。只顯示我的提交將文件移動到項目中,所以它看起來像這樣的歷史消失了。 – Rob 2011-05-26 22:46:52

0

我會做的是去子模塊。但是,如果你真的想回購相結合,做到以下幾點:

  • 建立新的版本
  • 作出初步承諾
  • 讓你想合併
  • 什麼樹枝從那裏到每一個項目要合併的每一個項目:
    • 切換到其臨時黨支部
    • 合併原來的倉庫
    • 其移動到項目目錄(用git MV)
    • 提交
  • 合併(掌握),並刪除所有的臨時項目分支
2

我沒有足夠的聲望來評論你的歷史問題,所以我必須寫一個答案。

使用--follow與日誌

--follow 
     Continue listing the history of a file beyond renames (works only 
     for a single file). 
+0

不幸的是,'git log --follow'在這種情況下不起作用。嘗試一下 - 它會產生空的輸出。顯然它不遵循合併提交很好。 – 2011-05-28 11:17:54

+0

我不知道,但至少我現在可以評論:) – tewe 2011-05-30 07:21:01

相關問題