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

git: 使用submodule進行托管

功能 直接 發生 con ive upd 分享圖片 comm update

問題描述:

當一個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則無相關記錄

  技術分享圖片

  

  

git: 使用submodule進行托管