2009-05-01 100 views
109

我已經繼承了一個包含多個項目在不同目錄中的git存儲庫。我想將存儲庫拆分爲新的單獨存儲庫,每個項目一個,然後讓主存儲庫包含作爲子模塊的項目。如果可能的話,我想盡一切努力保持個別項目的修訂歷史。如何在保持歷史的同時將單個目錄從git存儲庫移動到新的存儲庫?

我可以克隆每個項目的存儲庫並每次刪除所有其他項目,但是有沒有更好的方法來避免每個新項目存儲庫中都有克隆的歷史記錄?

+2

新增混帳子模塊的標籤,因爲這是用於將回購的一部分成子模塊非常有用的。 – idbrii 2012-08-01 18:53:24

+0

可能重複[出口子樹在Git與歷史記錄](http://stackoverflow.com/questions/1662753/export-subtree-in-git-with-history) – user 2016-11-27 18:29:57

回答

97

您可以使用git filter-branch來重寫項目的歷史。從文檔:

要重寫庫看作 如果foodir /曾其項目的根, 並放棄所有其他的歷史:

git filter-branch --subdirectory-filter foodir -- --all 

讓你的回購的多個副本,爲每一個你想要拆分的子目錄做這件事,並且你應該結束你正在尋找的東西。

1

git的一點是,歷史記錄通過散列父提交來體現在每次提交中。你可以「重放」提交(這實際上是svn導入程序的工作原理)到一個新的存儲庫中,只保留每個子項目。但是,這會破壞提交哈希的含義。如果你沒有問題,那就這樣吧。

在過去,我剛克隆它並繼續前進。這使事情變得更大,但磁盤空間便宜;我的時間很昂貴。

我也不知道任何工具拼接出一個目錄。我想你可以通過git-log來查找目錄上的所有提交,然後用git-fast-export之類的東西來重放提交。

+0

我upvoted,因爲這是因爲不應該是負面的 - 我當然不會採用這種方法,但是通過這樣做可以看出他正在嘗試 – Alvin 2014-01-04 01:38:11

1

要將文件夾導出爲你需要一個新的存儲庫:

  1. 克隆庫,你要導出的文件夾。
  2. 要在您的託管服務提供商處創建一個空的存儲庫作爲GitHub,以存儲導出的文件夾。
  3. 打開克隆庫文件夾,然後運行這個命令:

    git subtree push --prefix=YourFolderNameToExport https://github.com/YourUserName/YourNewCleanRepoName master 
    
相關問題