Initial commit: main project structure

This commit is contained in:
孙小云 2025-12-04 14:24:49 +08:00
commit 1fd9836881
5 changed files with 515 additions and 0 deletions

24
.gitignore vendored Normal file
View File

@ -0,0 +1,24 @@
# IntelliJ IDEA (root project only)
.idea/
*.iml
*.iws
*.ipr
# macOS
.DS_Store
.AppleDouble
.LSOverride
# Windows
Thumbs.db
ehthumbs.db
Desktop.ini
# Linux
*~
# Temporary files
*.tmp
*.bak
*.swp
*~.nib

14
pom.xml Normal file
View File

@ -0,0 +1,14 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tuoheng</groupId>
<artifactId>hyf</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Archetype - hyf</name>
<url>http://maven.apache.org</url>
<modules>
<module>thingsboard-client-demo</module>
<module>thingsboard-gateway-ws-demo</module>
</modules>
</project>

View File

@ -0,0 +1,358 @@
# 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
```

View File

@ -0,0 +1,48 @@
主仓库和子仓库确实是独立的 Git 仓库,各自有自己的提交历史。但关键在于: 主仓库需要记录"使用子模块的哪个版本"
工作原理
当你在主仓库中添加 submodule 时,主仓库实际上存储的是:
子模块的远程仓库 URL存在 .gitmodules 文件中)
子模块的特定 commit SHA这是关键
你可以理解为主仓库中有一个"指针",指向子模块的某个具体 commit。
为什么需要更新引用?
看这个场景:
# 子模块当前在 commit abc123
# 主仓库记录thingsboard-client-demo -> abc123
# 你修改了子模块代码
cd thingsboard-client-demo
git commit -m "新功能" # 产生新 commit def456
git push
# 此时:
# - 子模块远程仓库:最新是 def456
# - 主仓库记录:仍然是 abc123 ❌
如果不更新主仓库的引用,会发生什么?
其他团队成员克隆主仓库后,执行 git submodule update
他们会得到 abc123 版本的子模块
他们看不到你的新功能def456
更新引用的作用
cd /Users/sunpeng/workspace/hyf
git add thingsboard-client-demo # 更新指针abc123 -> def456
git commit -m "Update submodule"
git push
这一步是在告诉主仓库:"现在请使用子模块的 def456 版本"。
类比理解
可以把它想象成:
子仓库 = 一个独立的软件包(比如 npm 包)
主仓库 = package.json 文件
当你更新了软件包的代码并发布新版本后,你还需要在 package.json 中更新版本号,告诉项目"请使用新版本"。
// 类似于
{
"dependencies": {
"thingsboard-client-demo": "1.0.0" // 旧版本
"thingsboard-client-demo": "1.1.0" // 需要手动更新到新版本
}
}
总结
主仓库和子仓库是独立的,但主仓库需要明确记录使用子仓库的哪个版本。这样可以:
保证团队成员获得一致的代码版本
支持版本回退(可以回到使用旧版本子模块的状态)
避免子模块"自动更新"导致的不可预期问题
这就是为什么修改子模块后,需要在主仓库中更新引用的原因。

View File

@ -0,0 +1,71 @@
实际行为
当你在子模块有未提交的修改时执行 git submodule update
cd thingsboard-client-demo
# 修改了一些文件,但没有 commit
cd ..
git submodule update
Git 会:
检测到子模块有未提交的修改
拒绝更新,并给出类似这样的错误:
error: Your local changes to the following files would be overwritten by checkout:
src/main/java/SomeFile.java
Please commit your changes or stash them before you switch branches.
Unable to checkout 'abc123' in submodule path 'thingsboard-client-demo'
为什么会这样?
git submodule update 本质上是在子模块中执行 git checkout <commit>。Git 的保护机制会阻止 checkout 覆盖未提交的修改。
不同场景
场景 1未暂存的修改modified
cd thingsboard-client-demo
echo "test" >> file.txt # 修改文件,未 git add
cd ..
git submodule update
# ❌ 会报错,拒绝更新
场景 2已暂存但未提交staged
cd thingsboard-client-demo
echo "test" >> file.txt
git add file.txt # 已暂存,但未 commit
cd ..
git submodule update
# ❌ 仍然会报错,拒绝更新
场景 3新增的未跟踪文件untracked
cd thingsboard-client-demo
echo "test" > new-file.txt # 新文件,未 git add
cd ..
git submodule update
# ✅ 可以更新!因为新文件不会被覆盖
如何处理未提交的修改?
如果你确实需要更新子模块,有几个选择:
选项 1提交修改
cd thingsboard-client-demo
git add .
git commit -m "临时修改"
git push # 如果需要保存到远程
cd ..
git submodule update
选项 2暂存修改stash
cd thingsboard-client-demo
git stash # 暂存修改
cd ..
git submodule update
cd thingsboard-client-demo
git stash pop # 恢复修改
选项 3放弃修改
cd thingsboard-client-demo
git checkout . # 放弃所有修改
git clean -fd # 删除未跟踪的文件
cd ..
git submodule update
总结
你的修改是安全的Git 会保护你的工作:
有未提交修改时git submodule update 会拒绝执行
你的修改不会丢失
你需要先处理这些修改(提交、暂存或放弃)才能更新子模块
这是 Git 的安全机制,防止意外覆盖你的工作成果。