obj/ 是目录,*.exe 是文件,二者性质不同;路径规则中末尾加 / 明确匹配目录,避免误忽略同名源文件。

直接写 obj/ 和 *.exe 就够了,但必须注意路径匹配逻辑
VS C++ 工程中,obj/ 是目录,不是文件名通配;*.exe 是可执行文件后缀。两者性质不同,规则写法不能混用。常见错误是写成 obj(没加 /),结果连项目里叫 obj.cpp 的源文件也被误忽略。
正确写法是:
-
obj/—— 只匹配名为obj的目录及其全部内容(含子目录) -
bin/—— 同理,VS 默认输出目录,也应加/ -
*.exe—— 匹配任意层级下所有 .exe 文件(包括x64/Release/app.exe) -
*.pdb、*.ilk、*.suo、*.user—— 调试和用户配置文件,一并排除
为什么 x64/ 和 Debug/ 也要加 /?
VS 默认生成的平台/配置目录(如 x64/、Win32/、Debug/、Release/)都是目录,不是文件。Git 的 .gitignore 规则中,末尾不加 / 会同时匹配同名文件和目录——比如写 x64,就可能意外忽略掉一个叫 x64.cpp 的源码文件。
所以必须显式写成:
x64/Win32/-
[Dd]ebug/(方括号兼容大小写) [Rr]elease/
注意:正则风格的 [Dd]ebug 不是 Git 原生支持的正则,而是 shell glob 的字符类语法,Git 原生支持,无需额外启用。
已提交过的 obj/ 或 app.exe 怎么彻底停止追踪?
.gitignore 对**已被 Git 跟踪的文件完全无效**。如果之前手抖 git add . 过,现在改 .gitignore 没用。
必须手动取消索引(保留本地文件):
git rm -r --cached obj/-
git rm --cached *.exe(注意:这个命令会匹配当前目录下所有已跟踪的 .exe,不含子目录;如需递归,用git rm --cached **/*.exe,前提是 shell 支持 globstar) git commit -m "stop tracking build artifacts"
验证是否生效:git status --ignored 应该列出这些文件;git check-ignore -v obj/test.obj 应返回命中哪条规则。
第三方库的 x64/ 目录怎么保留不忽略?
模板里常有 x64/,但你引入的第三方 SDK 可能自带 x64/ 目录(比如放在 external/mylib/x64/)。这时需要“先忽略、再例外”:
- 确保
x64/在.gitignore中靠前位置 - 在它下方添加否定规则:
!external/x64/ - 注意顺序:Git 按行匹配,
!必须出现在对应x64/规则之后 - 路径要写全:
!external/x64/不等于!/external/x64/;前者是相对路径匹配,后者强制从根开始,但实际效果一致;推荐不加开头/,更灵活
容易漏的点:如果第三方库路径是 libs/thirdparty/x64/,那否定规则就得写成 !libs/thirdparty/x64/,不能只写 !x64/——! 不具备“穿透父级”的能力,只对直系匹配生效。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











