Git .gitignore 文件编写指南
目录
- [什么是 .gitignore](#什么是 .gitignore)
- [Git 状态说明](#Git 状态说明)
- 当前项目未跟踪文件分析
- 文件分类判定依据
- [.gitignore 完整规则说明](#.gitignore 完整规则说明)
什么是 .gitignore
.gitignore 是 Git 的配置文件,用来告诉 Git 哪些文件不需要跟踪。
为什么需要 .gitignore?
┌─────────────────────────────────────────────────────────────────┐
│ Git 仓库 │
│ │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ 源代码文件 │ │ 编译产物 │ │ 配置文件 │ │
│ │ (.cpp, .h) │ │ (.o, .a) │ │ (.pro.user) │ │
│ │ │ │ │ │ │ │
│ │ ✅ 需要跟踪 │ │ ❌ 不需要跟踪 │ │ ❌ 不需要跟踪 │ │
│ └───────────────┘ └───────────────┘ └───────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
Git 状态说明
Git 文件状态类型
| 状态 | 符号 | 说明 |
|---|---|---|
| 未修改 | (空) | 文件没有变化 |
| 已修改 | M |
文件有修改但未暂存 |
| 未跟踪 | ?? |
新文件,Git 不知道要不要跟踪 |
| 已暂存 | ( staged ) | 准备好提交了 |
查看当前 Git 状态
bash
git status --porcelain
输出示例:
M .gitignore # M = 已修改,未暂存
M CSCU_A1_GIT/Bus.h # M = 已修改,未暂存
?? CSCU_A1_GIT/MqttServer/ # ?? = 未跟踪,新文件
当前项目未跟踪文件分析
完整未跟踪文件列表
?? CSCU_A1_GIT/FileReleaseFiles/nandflash/mqtt_config.ini
?? CSCU_A1_GIT/FileReleaseFiles/nandflash/sbin/mqtt/lib/
?? CSCU_A1_GIT/MqttServer/
?? CSCU_A1_GIT/PahoMQTT/
?? CSCU_A1_GIT/TEUI_07/TEUI/src/MQTT/
?? CSCU_A1_GIT/mosquitto-2.0.10/
?? CSCU_A1_GIT/openssl-1.1.1w/
?? CSCU_A1_GIT/paho.mqtt.c-1.3.12/
?? toolchain.cmake
已修改但未暂存的文件
M .vscode/settings.json
M CSCU_A1_GIT/Bus/Bus.h
M CSCU_A1_GIT/Bus/Makefile.Bus
M CSCU_A1_GIT/CSCU_A1_Manage.pro
M CSCU_A1_GIT/CSCU_A1_Manage.pro.user
M CSCU_A1_GIT/Card/Makefile.Card
M CSCU_A1_GIT/ChargeEquipment/Makefile.ChargeEquipment
M CSCU_A1_GIT/ChargeServiceV3/Makefile.ChargeServiceV3
M CSCU_A1_GIT/Database/Makefile.DBOperate
M CSCU_A1_GIT/DevCache/Makefile.DevCache
M CSCU_A1_GIT/DeviceManage/Makefile.DeviceManage
M CSCU_A1_GIT/EnergyConsumeServer/EnergyConsumeServer.cpp
M CSCU_A1_GIT/EnergyConsumeServer/Makefile.EnergyConsumeServer
M CSCU_A1_GIT/FileReleaseFiles/nandflash/bin/cscu_a1.init
M CSCU_A1_GIT/FileReleaseFiles/nandflash/libconfig.ini
M CSCU_A1_GIT/FileReleaseFiles/nandflash/sbin/mqtt/mosquitto_pub
M CSCU_A1_GIT/FileReleaseFiles/nandflash/sbin/mqtt/mosquitto_sub
M CSCU_A1_GIT/FileSystemFiles_Common/nandflash/libconfig.ini
M CSCU_A1_GIT/GPIO_335X/Makefile.GPIO_335X
M CSCU_A1_GIT/GeneralData/GeneralData.h
M CSCU_A1_GIT/IEC104Server/Makefile.IEC104Server
M CSCU_A1_GIT/LCDScreen/LCDDef.h
M CSCU_A1_GIT/LCDScreen/Makefile.LCDScreen
M CSCU_A1_GIT/Log/Makefile.Log
M CSCU_A1_GIT/Makefile.CSCU_A1
M CSCU_A1_GIT/ParamSet/Makefile.ParamSet
M CSCU_A1_GIT/RealDataFilter/Makefile.RealDataFilter
M CSCU_A1_GIT/TEUI_07/TEUI/Makefile.TEUI
M CSCU_A1_GIT/TEUI_07/TEUI/TEUI
M CSCU_A1_GIT/TEUI_07/TEUI/TEUI.pro
M CSCU_A1_GIT/TEUI_07/TEUI/src/Charge/infomation4g.cpp
M CSCU_A1_GIT/TEUI_07/TEUI/src/Charge/infomation4g.h
M CSCU_A1_GIT/TEUI_07/TEUI/src/Common/InfoData.h
M CSCU_A1_GIT/TEUI_07/TEUI/ui/Charge/infomation4g.ui
M CSCU_A1_GIT/TempHumi/Makefile.TempHumi
M CSCU_A1_GIT/Update/Makefile.Update
M CSCU_A1_GIT/setup/Debug_setup_07.tar.gz
M CSCU_A1_GIT/setup/Release_setup_07.tar.gz
M CSCU_A1_GIT/setup/create_setup.sh
M build-CSCU_A1_Manage-Arm_A8-Release/Makefile
文件分类判定依据
判断原则:是否需要在新电脑可用?
问题:这个文件从仓库拉取后,另一台电脑能直接用吗?
┌─────────────────────────────────────────────────────────────────┐
│ 是 │
│ ↓ │
│ 这个文件是否编译/运行必需的? │
│ ↓ 是 │
│ 【必须跟踪】 │
│ │
│ ↓ 否 │
│ 【可以忽略】 │
│ │
└─────────────────────────────────────────────────────────────────┘
具体文件分析
1. toolchain.cmake
| 项目 | 内容 |
|---|---|
| 状态 | ?? (未跟踪) |
| 文件路径 | /toolchain.cmake |
| 文件内容 | 交叉编译工具链配置 |
判定依据:
bash
# 检查这个文件是否已经在Git仓库中
git ls-files --error-unmatch toolchain.cmake 2>/dev/null && echo "EXISTS" || echo "NEW"
# 输出: NEW(不在仓库中,是新文件)
分析:
- ❌ 绝对不能忽略:这是交叉编译的配置文件
- ✅ 必须跟踪:没有这个文件,其他电脑无法编译项目
错误示例:
# ❌ 错误写法:toolchain.cmake 被忽略后,另一台电脑编译失败
toolchain.cmake
正确写法:
# ✅ 正确写法:不添加 toolchain.cmake 到忽略列表
# 这样它会保持未跟踪状态,可以用 git add toolchain.cmake 手动添加
2. openssl-1.1.1w/
| 项目 | 内容 |
|---|---|
| 状态 | ?? (未跟踪) |
| 目录路径 | CSCU_A1_GIT/openssl-1.1.1w/ |
| 目录内容 | OpenSSL 交叉编译产物 |
判定依据:
bash
git ls-files --error-unmatch CSCU_A1_GIT/openssl-1.1.1w/ 2>/dev/null && echo "EXISTS" || echo "NEW"
# 输出: NEW(新目录,不在仓库中)
分析:
- ❌ 绝对不能忽略整个目录
- ✅ 必须跟踪 :
openssl-1.1.1w/是新加入的交叉编译库 - 如果忽略了,从仓库拉取后无法编译 MQTT 模块
目录内关键文件:
openssl-1.1.1w/
├── libcrypto.a ← 必须跟踪(静态库)
├── libssl.a ← 必须跟踪(静态库)
└── include/ ← 必须跟踪(头文件)
⚠️ 特别注意:
问:为什么不能用 *.a 忽略所有 .a 文件?
答:因为 openssl-1.1.1w/libcrypto.a 是编译好的静态库!
如果用 *.a 忽略了,所有电脑都编译不了。
正确做法:
1. 不要用 *.a 忽略(太宽泛)
2. 改为精确指定要忽略的文件
3. 或者直接跟踪整个目录
3. PahoMQTT/
| 项目 | 内容 |
|---|---|
| 状态 | ?? (未跟踪) |
| 目录路径 | CSCU_A1_GIT/PahoMQTT/ |
| 目录内容 | Paho MQTT 交叉编译产物 |
判定依据:
bash
git ls-files --error-unmatch CSCU_A1_GIT/PahoMQTT/ 2>/dev/null && echo "EXISTS" || echo "NEW"
# 输出: NEW(新目录,不在仓库中)
分析:
- ❌ 绝对不能忽略整个目录
- ✅ 必须跟踪 :
PahoMQTT/是新加入的 MQTT 客户端库 - 如果忽略了,从仓库拉取后无法编译 MQTT 模块
目录内关键文件:
PahoMQTT/
├── lib/
│ ├── libpaho-mqtt3cs.a ← 必须跟踪(静态库,同步+SSL)
│ ├── libpaho-mqtt3as.a ← 必须跟踪(异步+SSL)
│ ├── libpaho-mqtt3c.a ← 必须跟踪(同步)
│ └── libpaho-mqtt3a.a ← 必须跟踪(异步)
└── include/ ← 必须跟踪(头文件)
4. MqttServer/
| 项目 | 内容 |
|---|---|
| 状态 | ?? (未跟踪) |
| 目录路径 | CSCU_A1_GIT/MqttServer/ |
| 目录内容 | MQTT 模块核心代码 |
判定依据:
bash
git ls-files --error-unmatch CSCU_A1_GIT/MqttServer/ 2>/dev/null && echo "EXISTS" || echo "NEW"
# 输出: NEW(新目录,不在仓库中)
分析:
- ❌ 绝对不能忽略
- ✅ 必须跟踪:这是 MQTT 功能的核心代码
- 如果忽略了,从仓库拉取后没有 MQTT 功能
目录内关键文件:
MqttServer/
├── MqttServer.pro ← 必须跟踪(Qt项目文件)
├── MqttServer.h ← 必须跟踪(头文件)
├── MqttServer.cpp ← 必须跟踪(核心代码)
├── MqttProtocol.h ← 必须跟踪(协议处理)
└── MqttProtocol.cpp ← 必须跟踪(协议实现)
5. mosquitto-2.0.10/
| 项目 | 内容 |
|---|---|
| 状态 | ?? (未跟踪) |
| 目录路径 | CSCU_A1_GIT/mosquitto-2.0.10/ |
| 目录内容 | mosquitto 源码目录 |
判定依据:
- 这是 mosquitto 的源码包解压后的目录
- FileReleaseFiles 目录下已经有编译好的
mosquitto_pub和mosquitto_sub
分析:
- ⚠️ 可以忽略:因为部署用的是 FileReleaseFiles 下的二进制文件
- 但如果想要保留完整源码,可以跟踪
判断方法:
bash
# 查看是否已经有部署的二进制文件
ls -la CSCU_A1_GIT/FileReleaseFiles/nandflash/sbin/mqtt/mosquitto_pub
6. paho.mqtt.c-1.3.12/
| 项目 | 内容 |
|---|---|
| 状态 | ?? (未跟踪) |
| 目录路径 | CSCU_A1_GIT/paho.mqtt.c-1.3.12/ |
| 目录内容 | Paho MQTT 源码目录 |
判定依据:
- 这是 Paho MQTT 的源码包解压后的目录
PahoMQTT/是编译好的库目录
分析:
- ⚠️ 可以忽略 :因为
PahoMQTT/已经有编译好的库 - 如果要能重新编译 Paho,需要跟踪这个目录
判断方法:
PahoMQTT/lib/libpaho-mqtt3cs.a ← 已有编译好的库
paho.mqtt.c-1.3.12/ ← 源码目录(可以不要)
6.5 openssl/openssl/ (编译产物目录)
| 项目 | 内容 |
|---|---|
| 状态 | 被 .gitignore 忽略 |
| 目录路径 | CSCU_A1_GIT/openssl/openssl/ |
| 目录内容 | 交叉编译时自动生成的配置文件 |
判定依据:
bash
$ ls -la CSCU_A1_GIT/openssl/openssl/
总用量 16
drwxr-xr-x 2 dcuser dcuser 4096 4月 10 17:14 .
drwxr-xr-x 3 dcuser dcuser 4096 4月 10 17:14 ..
-rwxrwxr-x 1 dcuser dcuser 4622 4月 10 17:14 opensslconf.h
文件内容:
c
/*
* WARNING: do not edit!
* Generated by Makefile from include/openssl/opensslconf.h.in
*/
这个目录是做什么的?
这是 OpenSSL 交叉编译时自动生成的编译产物目录 ,包含 opensslconf.h 配置文件。
opensslconf.h 的作用:
| 宏定义 | 含义 |
|---|---|
OPENSSL_NO_MD2 |
不编译 MD2 摘要算法(已淘汰) |
OPENSSL_NO_RC5 |
不编译 RC5 对称加密算法 |
OPENSSL_THREADS |
支持多线程 |
OPENSSL_RAND_SEED_OS |
使用操作系统级别的随机数种子 |
OPENSSL_NO_SSL3 |
不支持 SSLv3(安全原因已禁用) |
OPENSSL_NO_WEAK_SSL_CIPHERS |
不支持弱 SSL cipher |
OPENSSL_NO_STATIC_ENGINE |
不静态链接加密引擎 |
两个 openssl 目录的区别:
| 目录 | 内容 | 是否需要跟踪 |
|---|---|---|
CSCU_A1_GIT/openssl-1.1.1w/ |
交叉编译好的静态库(libcrypto.a, libssl.a, include/) | ✅ 必须跟踪 |
CSCU_A1_GIT/openssl/openssl/ |
编译时生成的配置文件(opensslconf.h) | ❌ 应该忽略 |
为什么不需要跟踪?
- 编译产物:它是 OpenSSL 交叉编译时自动生成的,不是源码
- 已有完整库 :我们的
openssl-1.1.1w/目录包含了完整的静态库和头文件 - 重新编译会生成:如果重新交叉编译 OpenSSL,这个文件会自动重新生成
⚠️ 注意 :在 .gitignore 中添加了 CSCU_A1_GIT/openssl/openssl/ 来忽略这个目录,但注释掉了 CSCU_A1_GIT/openssl/openssl/ 因为它实际上没有被 Git 跟踪。
7. TEUI_07/TEUI/src/MQTT/
| 项目 | 内容 |
|---|---|
| 状态 | ?? (未跟踪) |
| 目录路径 | CSCU_A1_GIT/TEUI_07/TEUI/src/MQTT/ |
| 目录内容 | TEUI 模块的 MQTT 功能代码 |
判定依据:
bash
git ls-files --error-unmatch CSCU_A1_GIT/TEUI_07/TEUI/src/MQTT/ 2>/dev/null && echo "EXISTS" || echo "NEW"
# 输出: NEW(新目录)
分析:
- ❌ 不能忽略
- ✅ 必须跟踪:这是 TEUI 模块新增的 MQTT 功能代码
8. mqtt_config.ini
| 项目 | 内容 |
|---|---|
| 状态 | ?? (未跟踪) |
| 文件路径 | CSCU_A1_GIT/FileReleaseFiles/nandflash/mqtt_config.ini |
| 文件内容 | MQTT 配置文件 |
判定依据:
- 这是 MQTT 连接参数的配置文件
- 部署时需要拷贝到板子
分析:
- ✅ 建议跟踪:配置文件是部署必需的
9. FileReleaseFiles/nandflash/sbin/mqtt/lib/
| 项目 | 内容 |
|---|---|
| 状态 | ?? (未跟踪) |
| 目录路径 | CSCU_A1_GIT/FileReleaseFiles/nandflash/sbin/mqtt/lib/ |
| 目录内容 | MQTT 相关库文件 |
分析:
- ⚠️ 需要确认目录内容
- 如果包含必要的库文件,需要跟踪
已修改文件分析
10. *.pro.user 文件
| 文件 | 说明 |
|---|---|
CSCU_A1_GIT/CSCU_A1_Manage.pro.user |
Qt Creator 用户项目配置 |
判定依据:
- ❌ 必须忽略 :
*.pro.user是 Qt Creator 的用户配置 - 不同电脑的路径、构建目录不同,不应该共享
忽略规则:
*.pro.user
*.pro.user.*
11. *.tar.gz 文件
| 文件 | 说明 |
|---|---|
CSCU_A1_GIT/setup/Debug_setup_07.tar.gz |
安装包 |
CSCU_A1_GIT/setup/Release_setup_07.tar.gz |
安装包 |
判定依据:
- ⚠️ 可以忽略:压缩包可以在构建时重新生成
- 但如果作为发布版本备份,可以跟踪
忽略规则:
*.tar.gz
*.tar.bz2
*.tar.xz
*.zip
*.rar
12. Makefile.* 文件
| 文件 | 说明 |
|---|---|
CSCU_A1_GIT/Bus/Makefile.Bus |
Qt 自动生成的 Makefile |
CSCU_A1_GIT/Card/Makefile.Card |
Qt 自动生成的 Makefile |
判定依据:
bash
# Qt 项目中,qmake 会根据 .pro 文件自动生成 Makefile
# 例如:qmake MqttServer.pro 会生成 Makefile
# 这些文件是自动生成的,不需要跟踪
分析:
- ❌ 必须忽略:Makefile 由 qmake 自动生成
- 重新克隆后执行 qmake 会自动重新生成
忽略规则:
CSCU_A1_GIT/*/Makefile
CSCU_A1_GIT/*/Makefile.*
!CSCU_A1_GIT/Makefile.CSCU_A1 # 但保留主 Makefile
⚠️ 例外情况:
!CSCU_A1_GIT/Makefile.CSCU_A1 ← 这个不要忽略
原因:主 Makefile 可能包含额外的自定义配置
13. build-* 目录
| 目录 | 说明 |
|---|---|
build-CSCU_A1_Manage-Arm_A8-Release/ |
Qt 构建目录 |
判定依据:
- ❌ 必须忽略:这是 Qt 的构建输出目录
- 重新克隆后执行 qmake && make 会自动重新生成
忽略规则:
build-*/
Build-*/
14. *.o 文件
| 文件 | 说明 |
|---|---|
CSCU_A1_GIT/Log/Logger.o |
编译产生的目标文件 |
CSCU_A1_GIT/Log/LoggerRepository.o |
编译产生的目标文件 |
判定依据:
- ❌ 必须忽略 :
.o文件是编译产生的中间产物 - 重新克隆后执行 make 会自动重新生成
忽略规则:
*.o
.gitignore 完整规则说明
基础语法
# 注释行(以 # 开头)
*.[ext] # 忽略所有指定扩展名的文件
* # 忽略所有文件
**/file # 忽略所有目录下的 file 文件
!file # 不要忽略指定文件(取反)
常用模式
| 模式 | 含义 | 示例 |
|---|---|---|
*.o |
忽略所有 .o 文件 | *.o |
build-* |
忽略所有 build- 开头的目录 | build-Debug/ |
!lib/*.a |
但不要忽略 lib/ 下的 .a 文件 | !lib/*.a |
**/test |
忽略所有目录下的 test 文件/目录 | test/ |
dir/ |
忽略指定目录 | build/ |
本项目的 .gitignore 完整内容
gitignore
# ============================================================================
# Qt 自动生成文件
# ============================================================================
moc_*
qrc_*
ui_*
*.moc
*.obj
# ============================================================================
# 编译产物文件(必须忽略!)
# ============================================================================
# 目标文件 (.o)
*.o
# 动态库文件
*.so
*.so.*
# 可执行文件
*.bin
*.exe
*.out
# 静态库 - 【注意】不能用 *.a 全部忽略!
# openssl-1.1.1w/*.a 和 PahoMQTT/lib/*.a 必须跟踪!
# 下面会单独用 ! 来保留它们
# ============================================================================
# Qt 项目文件
# ============================================================================
build-*/
Build-*/
*.pro.user
*.pro.user.*
*.pri.user.*
*.sln.user*
*.vcxproj.user*
*.user
*.autosave
# ============================================================================
# 压缩包文件(一般不需要跟踪)
# ============================================================================
*.tar.gz
*.tar.bz2
*.tar.xz
*.zip
*.rar
# ============================================================================
# 临时文件
# ============================================================================
*.tmp
*.bak
*.swp
*~
.DS_Store
*.log
# ============================================================================
# 证书和密钥文件(一般不需要跟踪)
# ============================================================================
*.pem
*.key
*.crt
*.p12
*.pfx
# ============================================================================
# IDE 配置
# ============================================================================
.vscode/
.idea/
*.code-workspace
# ============================================================================
# Makefile 文件说明:
# Qt 项目中 qmake 会自动生成 Makefile,不需要跟踪
# 重新克隆后执行 qmake 会自动生成
# ============================================================================
# 各个模块的 Makefile(qmake自动生成)
CSCU_A1_GIT/*/Makefile
CSCU_A1_GIT/*/Makefile.*
!CSCU_A1_GIT/Makefile.CSCU_A1
# TEUI 子模块的 Makefile
CSCU_A1_GIT/TEUI_07/TEUI/Makefile
CSCU_A1_GIT/TEUI_07/TEUI/Makefile.*
# Build 目录
build-CSCU_A1_Manage-Arm_A8-Release/
# 根目录下的 Makefile(qmake自动生成)
CSCU_A1_GIT/Makefile
# ============================================================================
# 其他可选忽略的文件(根据需要决定是否跟踪)
# ============================================================================
# 通用命令/脚本文件
CSCU_A1_GIT/cmd.txt
# MQTT 脚本和文档(如果不需要跟踪)
CSCU_A1_GIT/FileReleaseFiles/nandflash/sbin/mqtt/*.sh
CSCU_A1_GIT/FileReleaseFiles/nandflash/sbin/mqtt/*.pdf
# 教程文档(如果不需要跟踪)
CSCU_A1_GIT/MqttServer_Tutorial_*.md
CSCU_A1_GIT/MqttServer_MQTT_Thread_Debug_Tutorial.md
# TEUI MQTT功能配置说明
CSCU_A1_GIT/TEUI_07/TEUI/MQTT功能配置说明.txt
# openssl 额外目录(如果存在且不需要)
CSCU_A1_GIT/openssl/openssl/
总结表格
| 文件/目录 | 状态 | 是否忽略 | 原因 |
|---|---|---|---|
toolchain.cmake |
?? |
❌ 不忽略 | 交叉编译必需 |
openssl-1.1.1w/ |
?? |
❌ 不忽略 | 交叉编译好的静态库和头文件 |
PahoMQTT/ |
?? |
❌ 不忽略 | 交叉编译好的静态库和头文件 |
MqttServer/ |
?? |
❌ 不忽略 | MQTT核心代码 |
CSCU_A1_GIT/openssl/openssl/ |
(未跟踪) | ✅ 忽略 | OpenSSL编译产物,openssl-1.1.1w已包含完整内容 |
paho.mqtt.c-1.3.12/ |
?? |
✅ 可忽略 | 源码,库已编译好 |
mosquitto-2.0.10/ |
?? |
✅ 可忽略 | 源码,工具已编译好 |
*.pro.user |
M |
✅ 忽略 | 用户配置,不同电脑不同 |
*.o |
M |
✅ 忽略 | 编译产物 |
Makefile.* |
M |
✅ 忽略 | qmake自动生成 |
build-*/ |
M |
✅ 忽略 | Qt构建目录 |
*.tar.gz |
M |
✅ 忽略 | 可重新生成 |
.vscode/ |
M |
✅ 忽略 | IDE配置 |