1. 程式人生 > >Git submodule 的入門操作

Git submodule 的入門操作

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

參考文件:
https://git-scm.com/book/zh/v2/Git-工具-子模組