如何將現有 git 倉庫中的子項目單獨抽出來作為一個獨立倉庫並保留其提交歷史


很多時候,我們會遇到在一個git倉庫下包含了很多小項目,但是隨着有些項目的需求逐漸增大或則市場需求,我們需要將其抽離出來,作為一個單獨的項目進行維護並開發。

但是,如果直接拷貝文件粘貼到新建的git repository中,會丟掉原有的commit,所以我們不能這么粗暴地做。

怎么辦呢?下面會根據一個例子,詳細說明。

假如我們在demos倉庫中,包含了如下小項目,其中,我們想將Comet這個目錄下的文件單獨抽出來,作為一個單獨的項目維護開發,如下:

首先,我們通過git clone 將demos導入到本地,然后通過git remote rm origin,切斷與遠程倉庫的關聯,如下:

然后,運行git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter <name-of-folder>命令,過濾掉並保留對指定子目錄的commit,並將該子目錄設為該倉庫的根目錄:

1. --tag-name-filter:控制我們如何處理舊tag,cat表示原樣輸出

2. --prune-empty:刪除空提交,即對子目錄沒有影響的

3. --subdirectory-filter:指定子目錄路徑

運行該命令后,我們可以看見我們的原倉庫變為了這樣:

雖然從表面上看,我們到達了我們的目的,新倉庫已變成了子目錄的內容,並且也保留了相關commit,但是新倉庫的.git目錄並沒有被reset,所以我們還需運行如下命令,去為.git瘦身,如下:

好了,到目前為止,子項目提取工作完成。

最后,就是將本地的這個子項目push到遠程倉庫中了。因為在此之前,我們已經斷了原有的遠程倉庫鏈接,所以此時我們需要將這個子項目鏈接到新的遠程倉庫中。

假設,我們新建一個遠程倉庫名為testRepo,如下:

按照提示,我們通過git remote add命令,將子項目與該遠程倉庫鏈接並push,如下:

這樣就完成了我們的目的,下面是遠程倉庫testRepo結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM