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

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

可是,若是直接拷貝文件粘貼到新建的git repository中,會丟掉原有的commit,因此咱們不能這麼粗暴地作。blog

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

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

首先,咱們經過git clone 將demos導入到本地,而後經過git remote rm origin,切斷與遠程倉庫的關聯,以下:it

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

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

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

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

運行該命令後,咱們能夠看見咱們的原倉庫變爲了這樣:filter

雖然從表面上看,咱們到達了咱們的目的,新倉庫已變成了子目錄的內容,而且也保留了相關commit,可是新倉庫的.git目錄並無被reset,因此咱們還需運行以下命令,去爲.git瘦身,以下:

好了,到目前爲止,子項目提取工做完成。

最後,就是將本地的這個子項目push到遠程倉庫中了。由於在此以前,咱們已經斷了原有的遠程倉庫連接,因此此時咱們須要將這個子項目連接到新的遠程倉庫中。

假設,咱們新建一個遠程倉庫名爲testRepo,以下:

按照提示,咱們經過git remote add命令,將子項目與該遠程倉庫連接並push,以下:

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

相關文章
相關標籤/搜索