2013-02-12 174 views
4

現在我知道最混帳專家會馬上想到git rebase,但我使用這個詞在更普遍的意義上的「重訂」:我有我的項目的結構如下:如何將嵌套的git倉庫合併到父倉庫,保留歷史記錄?

. 
.. 
.git 
tools 
lib 
src 
    .git 
build 

兩個../src目錄顯然是git存儲庫,並且從字面上來說有很長的歷史和大量的提交。 .中的存儲庫忽略src目錄(這是它自己的回購)。

我剛剛意識到我只想在.中追蹤所有包括源文件的單一回購,因爲坦白地說,構建系統隨着源代碼的發展而變得相當廣泛。

我的問題是,我不知道如何讓這個存儲庫保留歷史,現在是src中存儲庫的一部分。它甚至有可能嗎?這就是'rebasing'的含義 - 如果./src/main.c中的更改在某些N次提交中被./src/.git跟蹤,那麼我想保留這些更改並將它們作爲新存儲庫./.git的一部分。同樣的歷史,重新發布的文件路徑。

UPDATE

子樹合併是不是我要什麼別的東西,從我SO聚集。總之,它比我需要的要多得多。我只需要舊回購的內容,一起開發的所有分支以及所有提交,標籤等看起來好像它們始終是父回購的一部分。在本質上,唯一的變化是文件本身的路徑 - 在子回購跟蹤./main.c之前,新的回購現在將跟蹤./src/main.c,並且因爲我聽說過,git跟蹤內容,而不是文件,然後更改文件路徑,如上所述和對這些路徑的引用應該是相當平凡的,正確的?

+0

向谷歌詢問「子樹合併」,這就是你想要的。 – 2013-02-12 16:24:34

+0

我剛剛至少花了一個小時,並得出結論,子樹合併和子模塊都不適合我。子樹合併不僅保留了歷史,而且還保留了舊的和新的回購之間的聯繫 - 而我的舊回購將被退役並被廢棄。子模塊沒有問題,因爲我的回購協議非常緊密。我發現以下答案是最適合我的,但我真的想合併**所有**分支,而不僅僅是主人:http://stackoverflow.com/questions/13040958/merge-two-git-repositories -without-breaking-file-history/14470212#14470212 – amn 2013-02-12 18:25:15

回答

0

沒有真正的使用,如果這會工作,但可能值得一試。假設src位於遠程服務器上,父服務器位於遠程服務器上。你可以嘗試以下。

  • 的git克隆URL到遠程服務器克隆的工具,lib中的回購,並建立
  • 混帳增加遠程src網址到src遠程回購
  • 創建SRC遠程回購的跟蹤分支然後在父回購檢查出
  • 合併遠程跟蹤分支到你的主分支。
  • 刪除第二個遠程。
0

使用子樹合併。

我將列出的步驟,但他們在這個問題的答案:How do you merge two git repositories?

+0

在這兩個回購協議中,具有相同名稱的分支會發生什麼情況?而且,據我可以收集,合併涉及一個單一的分支,而我想所有的歷史'src'(與*所有*分支)。除此之外,子樹合併可能是我想要的。 – amn 2013-02-12 17:17:28

+0

我已經更新了我的問題,我擔心子樹合併對我來說有點太過分了,儘管我承認它主要是出於恐懼以及我發現的大量不同的其他策略,並且證明它(子樹合併)將無法準確保存歷史*。 – amn 2013-02-12 18:28:54

1

快速簡便的方法:

重命名SRC的所有文件,所以他們將與src/開始。將src repo添加爲遠程,獲取&合併。刪除舊的SRC回購,現在一切都在./

這會讓您記錄下此歷史記錄中的動作。

歷史改寫:

爲了使本次合併無形的,你需要使用git filter-branch --tree-filter在SRC庫中添加src/前綴。然後將其添加爲./存儲庫的遠程並獲取它(尚未合併)。爲了很好地融合歷史,您需要重新排序提交。使用git log --date-order master src/master檢索以正確的順序和這些提交櫻桃採摘它們:

git checkout -b new-master your-first-commit 
git log --format='%H' --date-order --reverse master src/master | xargs git cherry-pick 

這基本上不會對您的提交和線路起來線性歷史歸併排序。

這不會保留你的合併,所以不要這樣做,除非你有平坦的歷史。在這種情況下,只使用過濾分支,然後進行正常合併。

+0

我不確定採摘櫻桃 - 我想保留**整個**歷史,沒有例外。我也想保留所有**分支,而不僅僅是主人。你的解決方案能工作嗎 – amn 2013-02-12 20:47:22

+0

如果你有更長和更復雜的歷史,櫻桃挑選部分是一個壞主意,但過濾分支和合並將工作正常。但無論如何,只要運氣好一點,你可以在合併後使用交互式rebase(-i)重新排列提交。我寫的所有內容都保留着歷史,但它總是關於一個分支。您需要根據您的情況適當地處理每個分支。 – 2013-02-12 23:50:03

+0

謝謝@Josef。那麼,將我的嵌套倉庫自動合併到父倉庫,保留所有分支,提交和歷史記錄是不可能的?我必須照顧整個過程,可以這麼說嗎?我想我會讀「從下往上的git」,看看我是否想出了一些可以自動完成所有工作的腳本。你怎麼看? – amn 2013-02-13 10:08:45

相關問題