---
# System prepended metadata

title: GIT子模組_subModule
tags: [subModule, 子模組, git]

---

# GIT子模組_subModule

## 摘要
- 在某些情況下，我們可能會訂製一套固定的核心，訂製完之後就不去變更了，可是這個時候我們有其他專案需要調用該核心，最簡單的方法就是直接在該核心目錄下創建我們的專案，這可以運作但顯然不符合設計邏輯，這樣代表說我有10個新專案，我會在這個核心目錄下創建10個專案，這樣關git pr就超級亂了，所以這種情況下我們需要使用gitModule來做管理，將核心當作一個子模組來依賴，而新專案可以開一個獨立的Repo然後去引用子模組即可。

- 而這個子模組也有個名稱，統稱SubRepo因為它其實也是一個Repo我們只是掉他這個遠端倉庫。

- 那麼還會遇到一個問題，當子模組獨自升級時(有點中二，意思就是原Repo的作者更新了)，那麼我們引用的子模組並不會自我更新，此時就需要執行下面的 <子模組更新流程> 。

## 如何克隆帶有子模組的專案
```
git clone --recurse-submodules -j8 https://github.com/godchadigo/BaReporter.git
```

## 子模組更新流程
1. 使用指令合併。
2. 子倉庫是否需要更新，如果不用更新則跳過這步。
3. 子倉庫更新，cd到子模組目錄下，獨立提取git pull
4. 這步很重要，當更新完成後要記得cd回到主專案目錄，因為你奧push的不是子模組，而是自己的Repo
5. 撰寫更新 commit git commit -m "update SubMdoule"
6. 指定分支 git branch -M main
7. 推送 git push

## 如何操作
```git=
# 添加子模組
# git submodule add <子模組URL> <合併到當前repo的哪個目錄，如果不打就是直接放在跟目錄>
# 例如下面這個就是直接複製到主目錄下
git submodule add https://github.com/godchadigo/QJ.Communication.git
```
![image](https://hackmd.io/_uploads/H1_03dX61l.png)
成效圖


## 當顯示子模組於xxxxx版本中斷時解決方案
```
# 進入子模組目錄
cd 子模組路徑

# 切換到主分支（通常是 main 或 master）
git checkout master

# 拉取最新更新
git pull origin master

# 回到主專案根目錄
cd ..

# 提交子模組的更新
git add 子模組路徑
git commit -m "更新子模組到最新版本"
```



## 當原始資料整批複製到別處的時候時
```
# 1. 進入新專案目錄
cd 你的專案根目錄

# 2. 初始化子模組
git submodule init

# 3. 更新子模組
git submodule update --init --recursive


```