Git submodule 的入門操作
阿新 • • 發佈:2019-01-09
1) 簡單介紹
有種情況我們經常會遇到:某個工作中的專案需要包含並使用另一個專案。 也許是第三方庫,或者你獨立開發的,用於多個父專案的庫。 現在問題來了:你想要把它們當做兩個獨立的專案,同時又想在一個專案中使用另一個。
2) 建立準備的專案倉庫
在github上建立一個project倉庫作為和一個module倉庫來演示對submodule
的操作, 下面project專案, module與它相同, 只包含一個readme.md檔案.
# project 專案
[email protected]:xxxxx/project1.git
# module專案
[email protected] :xxxxx/module.git
3) 新增 submodule
通過如下命令在project目錄下新增module, 首先切換到project
目錄下, cd ~/project
git submodule add https://github.com/xxx/module.git
等待結束
$ pwd
顯示路徑為 ~/project
$ ls
. module/ readme.md .gitmodules
在module目錄下 git status
檢視狀態
On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: .gitmodules new file: module
在module目錄下
git add ./
git commit -m "add submodule"
git push
到這裡你成功添加了一個submodule.
4) 克隆含有子模組的專案
切換到project2
目錄下, 執行下面命令
$ pwd
~/project2
$ git clone [email protected]:xxxxx/project1.git
.........省略
$ ls
. module/ readme.md .gitmodules
其中有 module 目錄, 不過是空的, 你必須執行兩個命令:
git submodule init
git submodule update
則從該專案中抓取所有資料並檢出父專案中列出的合適的提交。現在 module 子目錄是處在和之前提交時相同的狀態了。
補充: 如果在clone project 專案的同時加上
--recursive
引數, 它就會自動初始化並更新倉庫中的每一個子模組。
5) 修改module
在project2
目錄下
$ pwd
~/project2
$ ls
. module/ readme.md .gitmodules
$ cd module
$ ls
. readme.md
$ touch a.py
$ ls
. readme.md a.py
在module
目錄下新增檔案a.py
, 通過git status
檢視狀態
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: a.py
在module目錄下
git add ./
git commit -m "add a.py"
git push
然後回退到上層目錄project2
目錄下, 通過git status
檢視狀態
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: a.py (new commits)
在project2目錄下
git add ./
git commit -m "update submodule"
git push
6) 更新子模組
現在我是另一個人,我想使用這次修改的提交, 我要切換到project1
目錄下執行git pull
操作
, 同時到module
目錄下執行git pull
操作即可.
cd project1
git pull
git submodule update