.gitignore
文件的语法规则如下,用于精确控制 Git 版本库中需要忽略的文件和目录:
#
开头 → 注释行gitignore# 这是注释,不会被处理
/
结尾 → 仅匹配目录gitignorelogs/ # 忽略所有 logs 目录 /temp/ # 只忽略根目录下的 temp 目录
*
通配符 → 匹配任意字符(除路径分隔符 /
)gitignore*.log # 忽略所有 .log 文件 build/*.js # 忽略 build 目录下所有 .js 文件
**
双星号 → 跨目录匹配gitignore**/temp # 忽略所有层级的 temp 目录(如 /temp, src/temp) docs/**/*.tmp # 忽略 docs 下任意子目录的 .tmp 文件
?
问号 → 匹配单个字符gitignore?.txt # 忽略 a.txt, b.txt,但不忽略 ab.txt
[]
中括号 → 字符集合gitignore[abc].log # 忽略 a.log, b.log, c.log
!
开头 → 取反规则(不忽略)gitignore*.log # 忽略所有 .log 文件 !error.log # 但不要忽略 error.log
模式 | 含义 | 示例匹配 |
---|---|---|
/dir | 仅匹配根目录下的 dir | /dir/file (√) src/dir (×) |
dir/ | 匹配所有名为 dir 的目录 | a/dir/ , /b/dir/ |
file | 匹配所有名为 file 的文件/目录 | /file , src/file |
dir/*.js | 匹配 dir 目录下的直接子层 .js 文件 | dir/a.js (√) dir/b/c.js (×) |
dir/**/*.js | 匹配 dir 目录下所有层级的 .js 文件 | dir/a.js , dir/sub/b.js |
就近原则
同一目录下的 .gitignore
优先级高于父目录的规则。
取反规则优先
gitignore*.txt # 忽略所有 .txt !important/ # 不忽略 important 目录 !important/*.txt # 不忽略 important 下的 .txt
忽略空目录
Git 默认不跟踪空目录,无需额外配置。
转义特殊字符
用 \
转义特殊字符(如 *
, !
, #
):
gitignore\#important.txt # 忽略名为 #important.txt 的文件
gitignore.DS_Store # 忽略系统隐藏文件 .env # 忽略项目环境文件
gitignore# ===== 基础忽略 ===== node_modules/ dist/ *.log # ===== 系统文件 ===== .DS_Store Thumbs.db # ===== 例外规则 ===== !src/assets/ # 保留 assets 目录(即使父目录被忽略) !*.min.js # 保留所有 .min.js 文件 # ===== 目录精确控制 ===== /temp # 仅忽略根目录的 temp build/*.tmp # 忽略 build 下的 .tmp 文件 !build/*.js # 但保留 build 下的 .js 文件
bashgit status --ignored # 显示被忽略的文件
bashgit add -f debug.log # 强制添加被忽略的文件
💡 提示:语法规则在
.gitignore
和.git/info/exclude
中通用,后者仅对本地仓库生效。
要忽略已经被 Git 跟踪的文件(即以前提交过的文件),需要执行以下步骤:
git rm --cached
命令:bash# 移除单个文件
git rm --cached <文件路径>
# 移除整个目录(保留本地目录)
git rm -r --cached <目录路径>
.gitignore
bashecho "<文件或目录名>" >> .gitignore
bashgit add .gitignore
git commit -m "停止跟踪 <文件/目录> 并添加到 gitignore"
bash# 假设要忽略已经提交的 config.ini 文件
git rm --cached config.ini
# 添加到 .gitignore
echo "config.ini" >> .gitignore
# 提交变更
git add .gitignore
git commit -m "忽略 config.ini"
bash# 假设要忽略已提交的 logs/ 目录
git rm -r --cached logs/
# 添加到 .gitignore
echo "logs/" >> .gitignore
# 提交变更
git add .gitignore
git commit -m "忽略 logs 目录"
--cached
参数是关键
git rm --cached
仅从 Git 索引中移除文件,保留本地文件--cached
,文件会从本地删除(危险!)已被提交的历史记录不受影响
团队协作时的处理
bash# 推送变更到远程仓库
git push origin <分支名>
需要清理历史记录的情况
如果要从历史提交中彻底删除敏感文件(如密码),需使用:
bashgit filter-repo --invert-paths --path <文件路径>
⚠️ 这会重写历史,影响所有协作者
bash# 检查文件状态(应显示为 "untracked" 或消失)
git status
# 确认文件仍在本地
ls <文件路径>
场景:只想忽略已提交文件的修改(保留文件跟踪)
使用 assume-unchanged
(仅本地生效):
bashgit update-index --assume-unchanged <文件路径>
若要恢复跟踪:
bashgit update-index --no-assume-unchanged <文件路径>
[已提交的文件] ↓ git rm --cached <路径> → 从索引移除(保留本地) ↓ 添加到 .gitignore → 防止未来重新跟踪 ↓ 提交变更 → 同步到远程仓库
本文作者:小明
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!