1. 程式人生 > >git: 使用submodule進行託管

git: 使用submodule進行託管

問題描述:

當一個prj.git專案裡引用了另外一個moduleA.git專案作為其一個子模組,由於該模組未完善後續可能將繼續升級,也就是需要兩套git分別管理prj.git與moduleA.git,而prj.git又使用了moduleA.git。

使用submodule進行管理

  1.  新建一個專案git 

  

  2. 新建一個mouleA.git

  

  3. 在prj.git裡新增moudleA.git。

  

  

帶有submodule倉庫的克隆方法

  1. 直接clone的話是沒有submodule資訊的,只有資料夾。

  

  這是因為,父專案的git並不會記錄submodule的檔案變動,它是按照commit id指定submodule的git header。

   不過可以先對submodule初始化,然後更新,就可以clone到原module的內容。

  

  2. 第二種方式使用遞迴clone,新增引數 --recursive

  

在遠端修改submodule及本地更新submodule

  1. 遠端更新submodule

  

  2. 本地更新submodule

  2.1 直接pull或者更新submodule是無效的,因為遠端prj.git並未記錄submodule有任何的改動,即遠端prj.git不知道也根本不管submodule有沒有更新,除非你在prj.git有commit記錄。

  

  2.2 在這種情況下仍要更新submodule,就需要直接進入submodule倉庫下並切換為需要的分支進行更新。

  

  2.3 這時prj.git 理所當然地發生了變化,根據需要提交變更記錄即可。

  

在本地修改submodule並push後,他處submodule更新流程

  1. 本地A修改submodule並Push

    1.1. 現在本地submodule新增一個新功能:c.md,然後push。

   

    1.2 接著,提交本次prj.git的變更記錄:

   

   2. 他處B更新submodule

    2.1 pull後發現submodule發生了改動:

    

    2.2 使用update對submodule進行更新

    

刪除submodule

  1.  git rm moduleA,即可

  

  這樣做git的config檔案中仍有相關記錄,但是不影響使用,如果新clone的話,就不會有相關的記錄了。

  如果介意可以手動將該檔案的相關行刪除。

  

  2. 新clone後,config則無相關記錄