hyf/reademe/submodule/reademe.md

359 lines
6.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# HYF 项目
这是一个使用 Git Submodules 管理的 Maven 多模块项目。
## 项目结构
```
hyf/
├── pom.xml # 父项目 POM
├── thingsboard-client-demo/ # 子模块1Git Submodule
└── thingsboard-gateway-ws-demo/ # 子模块2Git Submodule
```
---
## 一、如何添加一个新的 Module
### 1.1 创建并初始化新模块的 Git 仓库
```bash
# 在本地创建新模块目录和代码
cd /Users/sunpeng/workspace/hyf
mkdir new-module
cd new-module
# 初始化 Git 仓库
git init
git add .
git commit -m "Initial commit: new module"
# 关联远程仓库并推送
git remote add origin <新模块的远程仓库URL>
git branch -M main
git push -u origin main
```
### 1.2 将新模块添加为 Submodule
```bash
# 回到根目录
cd /Users/sunpeng/workspace/hyf
# 删除本地的新模块目录
rm -rf new-module
# 添加为 Git Submodule
git submodule add <新模块的远程仓库URL> new-module
# 提交 submodule 配置
git add .
git commit -m "Add new-module as submodule"
git push
```
### 1.3 更新父项目 pom.xml
编辑根目录的 `pom.xml`,在 `<modules>` 标签中添加新模块:
```xml
<modules>
<module>thingsboard-client-demo</module>
<module>thingsboard-gateway-ws-demo</module>
<module>new-module</module>
</modules>
```
提交修改:
```bash
git add pom.xml
git commit -m "Add new-module to parent pom"
git push
```
---
## 二、如何更新 Module子模块
### 2.1 修改子模块代码
```bash
# 进入子模块目录
cd thingsboard-client-demo
# 修改代码后提交
git add .
git commit -m "描述你的修改内容"
git push
```
### 2.2 在主仓库中更新子模块引用
**重要**:修改子模块后,主仓库需要更新对子模块 commit 的引用。
```bash
# 回到根目录
cd /Users/sunpeng/workspace/hyf
# 查看子模块状态(会显示子模块有新的 commit
git status
# 提交子模块引用的更新
git add thingsboard-client-demo
git commit -m "Update thingsboard-client-demo submodule"
git push
```
### 2.3 同时修改多个子模块
```bash
# 1. 提交第一个子模块
cd thingsboard-client-demo
git add .
git commit -m "修改客户端代码"
git push
# 2. 提交第二个子模块
cd ../thingsboard-gateway-ws-demo
git add .
git commit -m "修改网关代码"
git push
# 3. 回到根目录,更新所有子模块引用
cd ..
git add .
git commit -m "Update submodules"
git push
```
---
## 三、如何拉代码并更新各个子模块
### 3.1 首次克隆项目(推荐方式)
```bash
# 一次性克隆主仓库和所有子模块
git clone --recursive <主仓库URL>
```
### 3.2 首次克隆项目(分步方式)
```bash
# 先克隆主仓库
git clone <主仓库URL>
cd hyf
# 初始化并拉取所有子模块
git submodule init
git submodule update
```
### 3.3 已有项目,拉取最新代码
```bash
cd /Users/sunpeng/workspace/hyf
# 拉取主仓库最新代码
git pull
# 更新所有子模块到主仓库记录的版本
git submodule update
# 或者:更新所有子模块到各自远程仓库的最新版本
git submodule update --remote
```
### 3.4 拉取特定子模块的最新代码
```bash
# 进入子模块目录
cd thingsboard-client-demo
# 拉取该子模块的最新代码
git pull origin main
# 回到根目录,提交子模块引用的更新
cd ..
git add thingsboard-client-demo
git commit -m "Update thingsboard-client-demo to latest"
git push
```
---
## 四、如何更新主模块和子模块
### 4.1 只修改了主模块(根目录文件)
```bash
cd /Users/sunpeng/workspace/hyf
# 修改了 pom.xml、.gitignore 等根目录文件
git add .
git commit -m "描述主模块的修改内容"
git push
```
### 4.2 同时修改了主模块和子模块
```bash
# 1. 先提交所有子模块的修改
cd thingsboard-client-demo
git add .
git commit -m "修改客户端代码"
git push
cd ../thingsboard-gateway-ws-demo
git add .
git commit -m "修改网关代码"
git push
# 2. 回到根目录,提交主模块和子模块引用的更新
cd ..
git add .
git commit -m "Update main module and submodules"
git push
```
### 4.3 团队协作:同步他人的修改
当其他人修改了主模块或子模块后,你需要同步:
```bash
cd /Users/sunpeng/workspace/hyf
# 拉取主仓库最新代码
git pull
# 更新所有子模块到主仓库记录的版本
git submodule update --init --recursive
```
**注意**`--init` 参数会自动初始化新添加的子模块。
---
## 常用命令速查
### 查看状态
```bash
# 查看主仓库状态
git status
# 查看所有子模块状态
git submodule foreach git status
# 查看子模块的详细信息
git submodule status
```
### 批量操作子模块
```bash
# 在所有子模块中执行命令
git submodule foreach <command>
# 例如:在所有子模块中拉取最新代码
git submodule foreach git pull origin main
# 例如:在所有子模块中查看当前分支
git submodule foreach git branch
```
### 子模块更新
```bash
# 更新子模块到主仓库记录的版本
git submodule update
# 更新子模块到远程最新版本
git submodule update --remote
# 初始化并更新所有子模块(包括新添加的)
git submodule update --init --recursive
```
---
## Maven 构建
```bash
# 在根目录构建所有模块
mvn clean install
# 只构建特定模块
mvn clean install -pl thingsboard-client-demo
# 构建特定模块及其依赖
mvn clean install -pl thingsboard-client-demo -am
```
---
## 重要注意事项
1. **子模块修改流程**:先在子模块目录提交并推送,再回到主仓库更新子模块引用
2. **主仓库记录的是子模块的特定 commit**,不是分支名
3. **克隆项目时务必使用 `--recursive`**,或手动执行 `git submodule update --init`
4. **拉取代码后记得执行 `git submodule update`**,确保子模块版本正确
5. **团队协作时**,确保所有成员理解 submodule 的工作方式,避免子模块版本混乱
---
## 工作流程示例
### 日常开发流程
```bash
# 1. 早上开始工作,拉取最新代码
cd /Users/sunpeng/workspace/hyf
git pull
git submodule update --init --recursive
# 2. 修改子模块代码
cd thingsboard-client-demo
# ... 编写代码 ...
git add .
git commit -m "实现新功能"
git push
# 3. 更新主仓库的子模块引用
cd ..
git add thingsboard-client-demo
git commit -m "Update thingsboard-client-demo"
git push
# 4. 如果修改了主模块配置
git add pom.xml
git commit -m "更新依赖版本"
git push
```
### 添加新功能模块流程
```bash
# 1. 创建新模块仓库并推送
mkdir new-feature
cd new-feature
git init
# ... 创建代码 ...
git add .
git commit -m "Initial commit"
git remote add origin <新模块URL>
git push -u origin main
# 2. 添加为 submodule
cd /Users/sunpeng/workspace/hyf
rm -rf new-feature
git submodule add <新模块URL> new-feature
# 3. 更新 pom.xml
# 编辑 pom.xml添加 <module>new-feature</module>
git add .
git commit -m "Add new-feature module"
git push
```