Git 中一個類似Composer 的工具– 子模塊
Composer 對於做PHP 開發的人來說一定不陌生,也極大的方便了日常開發工作,找到合適的包直接加載一下就可以使用
對於Git 中的一個工具你了解過嗎,在工作中的項目可能需要包含另外一個項目,也許是一個第三方庫,也許是你自己開發的一個私有庫
說到第三方庫一定會想到使用Composer 去加載,使用Composer 加載你在部署的時候要確保每一個客戶端都包含這個庫
如果將代碼複製到自己的項目中,那麼你做的任何自定義修改都會在合併的時候變得困難
Git 通過子模塊來解決了這個問題。子模塊允許你將一個Git 倉庫作為另一個Git 倉庫的子目錄,它能讓你將另一個倉庫克隆到自己的項目中,同時還保持提交的獨立
開始使用子模塊
在已存在的倉庫中添加子模塊,可以使用git submodule add
命令,比如這樣
$ git submodule add git@github.com:sy-records/GetIP.git
默認情況下,子模塊會將子項目放到一個與倉庫同名的目錄中,本例中是“GetIP”。如果你想要放到其他地方,那麼可以在命令結尾添加一個不同的路徑
查看一下狀態會發現:
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD ..." to unstage)
new file: .gitmodules
new file: GetIP
多出了一個.gitmodules
文件
這個配置文件是保存了項目的URL和本地目錄之間的映射關係
$ cat .gitmodules
[submodule "GetIP"]
path = GetIP
url = git@github.com:sy-records/GetIP.git
如果有多個子模塊,這個文件中就會有多條記錄,它會和該項目的其他部分一同被拉取推送,這就是克隆該項目的人知道去哪獲得子模塊的原因
克隆含有子模塊的項目
還跟平常克隆項目一樣git clone
的命令
$ git clone git@github.com:sy-records/git-submodule.git
然後你就會發現,克隆下來的子模塊文件夾是空的,沒有代碼
是因為包含子模塊的項目不僅僅克隆下來就可以了,需要運行兩個命令:
git submodule init
用來初始化本地配置文件
git submodule update
從該項目中抓取所有數據並檢出父項目中列出的合適的提交
$ git submodule init
Submodule 'GetFavicon' (git@github.com:sy-records/GetFavicon.git) registered for path 'GetFavicon'
Submodule 'GetIP' (git@github.com:sy-records/GetIP.git) registered for path 'GetIP'
$ git submodule update
Cloning into 'F:/Test/git-submodule/GetFavicon'...
Cloning into 'F:/Test/git-submodule/GetIP'...
Submodule path 'GetFavicon': checked out '2808acdbbfa08579460e5edc9f26bce49c8a66a9'
Submodule path 'GetIP': checked out '48be97908b62fb9a8c3623feb67f45e3c7a484f0'
或者在克隆的時候加上--recursive
選項,就會在拉取的時候自動初始化並更新倉庫中的每一個子模塊
就先說這麼多,溜了