git 子模組使用小結

小黎也發表於2019-03-04

目前公司搭建了一個公共元件庫,想用於多個系統,就想到了使用 git 中的子模組 submodule

在介紹子模組前先回顧下git的一些基本知識

commit 操作

  1. 每次commit後發生了什麼?
    生成commit物件,包括上游指標,作者,提交資訊,及指向暫存內容快照的指標
commit.jpg

分支

分支其實是一個指向commit物件的指標,它會在每次的提交操作中自動向前移動。

master.jpg

HEAD指標

它是一個指向你正在工作中的本地分支的指標,也可以看成是當前工作分支的一個別名,所以切換分支,其實就是修改HEAD指標的指向,HEAD會隨著當前提前往前移動,所以它與分支的指向是一致的

head.jpg

遊離指標

HEAD 頭指標指向了一個具體的提交HASH值,而不是一個引用(分支)

子模組

什麼是子模組

通俗的說就是,在專案中使用共享庫程式碼,且與當前專案相互獨立,互不影響

基本操作命令

  • git submodule --h 檢視幫助
  • git submodule add新增子模組
  • 生成.gitmodules檔案
      path = rack
      url = git://github.com/chneukirchen/rack.git
複製程式碼
  • 更新方式與普通專案一樣

克隆一個帶子模組的專案

  • git submodule init 初始化子模組
  • git submodule update 因為你所擁有的指向子模組的指標和子模組目錄的真實狀態並不匹配

小貼士

  1. 子模組的指標是遊離態的,所以可以理解為子模組的檔案是指標指向的暫存區的檔案
  2. 在提交子模組的時候,我們提交上去的不是具體的檔案,而是子模組當前的指標HASH值
  3. 所以根據這一特性,我們可以使用不同的指標來區分版本,舉個例子,子模組有兩個分支 1.02.0,在A專案中使用的是1.0,在B專案中使用的是2.0,那麼在A專案中,就把子模組的指標指向1.0的首指標,B專案亦同。
  4. 一般情況下不建議在子模組中修改程式碼