2012-01-19 109 views
3

我有一個存儲庫B,其內容需要駐留在A .../A/src/B的子目錄中。我想最終得到一個存儲庫A,其中包含A和B提交的歷史記錄。在不同目錄級別合併git存儲庫

網絡上的其他解決方案似乎告訴我如何使樹完整保存在單獨的子樹中或合併選定的存儲庫部分具有相同的目錄結構。

那麼,有沒有辦法做到這一點?

回答

19

這其實很簡單,但命令並不一定很明顯。如果你以後需要從B中整合更多更新,一個不錯的選擇是git-subtree(不要與子樹合併策略混淆)。你說你想結束一個倉庫,所以使用git子模塊是不合適的。

這裏有這樣的經典的方式,與一些解釋:

  1. 變成倉庫答:

    cd A 
    
  2. 從倉庫B抓取master分支(或其他),和(暫時)將其存儲爲FETCH_HEAD

    git fetch /home/whoever/dev/B master 
    
  3. 做一個合併,忽略FETCH_HEAD的更改,但不要提交。這樣我們以後可以進行合併,合併的父母將包括FETCH_HEAD。 (該父存儲在.git/MERGE_HEAD。)

    git merge -s ours --no-commit FETCH_HEAD 
    
  4. 在子目錄src/B閱讀從FETCH_HEAD樹(仍是獲取master分支B)到臨時區域。該-u指反映,在工作副本的結果,以及:

    git read-tree --prefix=src/B/ -u FETCH_HEAD 
    
  5. 最後提交的結果:

    git commit -m "Merge in the history of master from B into src/B" 
    

這類似於什麼是GitHub's help page on the subtree merge strategy建議,除我跳過了爲B創建了一個遙控器。請注意,此過程實際上並未使用子樹合併策略 - 如果我理解正確,這隻適用於從B開始進一步更改。

+0

這對我來說更加清晰。我很難理解「我們的」意思......我認爲fetch會將文件放在錯誤的目錄中。 ... 謝謝。 – fodon

相關問題