编辑
2025-06-03
开发
00

目录

gitignore文件学习
01 语法知识
基础语法规则
路径匹配规则
优先级与冲突处理
特殊语法技巧
完整示例
验证规则
02 忽略已跟踪文件
核心步骤:
详细操作流程:
情况 1:忽略单个文件
情况 2:忽略整个目录
重要注意事项:
验证是否生效:
特殊情况处理:
总结流程图:

gitignore文件学习

01 语法知识

.gitignore 文件的语法规则如下,用于精确控制 Git 版本库中需要忽略的文件和目录:


基础语法规则

  1. # 开头 → 注释行
gitignore
# 这是注释,不会被处理
  1. / 结尾 → 仅匹配目录
gitignore
logs/ # 忽略所有 logs 目录 /temp/ # 只忽略根目录下的 temp 目录
  1. * 通配符 → 匹配任意字符(除路径分隔符 /
gitignore
*.log # 忽略所有 .log 文件 build/*.js # 忽略 build 目录下所有 .js 文件
  1. ** 双星号 → 跨目录匹配
gitignore
**/temp # 忽略所有层级的 temp 目录(如 /temp, src/temp) docs/**/*.tmp # 忽略 docs 下任意子目录的 .tmp 文件
  1. ? 问号 → 匹配单个字符
gitignore
?.txt # 忽略 a.txt, b.txt,但不忽略 ab.txt
  1. [] 中括号 → 字符集合
gitignore
[abc].log # 忽略 a.log, b.log, c.log
  1. ! 开头 → 取反规则(不忽略)
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

优先级与冲突处理

  1. 就近原则
    同一目录下的 .gitignore 优先级高于父目录的规则。

  2. 取反规则优先

gitignore
*.txt # 忽略所有 .txt !important/ # 不忽略 important 目录 !important/*.txt # 不忽略 important 下的 .txt

特殊语法技巧

  1. 忽略空目录
    Git 默认不跟踪空目录,无需额外配置。

  2. 转义特殊字符
    \ 转义特殊字符(如 *, !, #):

gitignore
\#important.txt # 忽略名为 #important.txt 的文件
  1. 匹配隐藏文件
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 文件

验证规则

  1. 检查忽略效果:
bash
git status --ignored # 显示被忽略的文件
  1. 强制添加被忽略的文件:
bash
git add -f debug.log # 强制添加被忽略的文件

💡 提示:语法规则在 .gitignore.git/info/exclude 中通用,后者仅对本地仓库生效。

02 忽略已跟踪文件

要忽略已经被 Git 跟踪的文件(即以前提交过的文件),需要执行以下步骤:


核心步骤:

  1. 从 Git 索引中移除文件(保留本地文件)
    使用 git rm --cached 命令:
bash
# 移除单个文件 git rm --cached <文件路径> # 移除整个目录(保留本地目录) git rm -r --cached <目录路径>
  1. 将文件/目录添加到 .gitignore
bash
echo "<文件或目录名>" >> .gitignore
  1. 提交变更
bash
git add .gitignore git commit -m "停止跟踪 <文件/目录> 并添加到 gitignore"

详细操作流程:

情况 1:忽略单个文件

bash
# 假设要忽略已经提交的 config.ini 文件 git rm --cached config.ini # 添加到 .gitignore echo "config.ini" >> .gitignore # 提交变更 git add .gitignore git commit -m "忽略 config.ini"

情况 2:忽略整个目录

bash
# 假设要忽略已提交的 logs/ 目录 git rm -r --cached logs/ # 添加到 .gitignore echo "logs/" >> .gitignore # 提交变更 git add .gitignore git commit -m "忽略 logs 目录"

重要注意事项:

  1. --cached 参数是关键

    • git rm --cached 仅从 Git 索引中移除文件,保留本地文件
    • 若不加 --cached,文件会从本地删除(危险!)
  2. 已被提交的历史记录不受影响

    • 文件会从后续提交中消失
    • 但历史提交中仍然存在该文件
  3. 团队协作时的处理

    bash
    # 推送变更到远程仓库 git push origin <分支名>
    • 其他成员拉取代码后:
      • 被忽略文件会从他们的 Git 索引中移除
      • 但本地文件仍保留(不会删除)
  4. 需要清理历史记录的情况
    如果要从历史提交中彻底删除敏感文件(如密码),需使用:

    bash
    git filter-repo --invert-paths --path <文件路径>

    ⚠️ 这会重写历史,影响所有协作者


验证是否生效:

bash
# 检查文件状态(应显示为 "untracked" 或消失) git status # 确认文件仍在本地 ls <文件路径>

特殊情况处理:

场景:只想忽略已提交文件的修改(保留文件跟踪)
使用 assume-unchanged(仅本地生效):

bash
git update-index --assume-unchanged <文件路径>

若要恢复跟踪:

bash
git update-index --no-assume-unchanged <文件路径>

总结流程图:

[已提交的文件] ↓ git rm --cached <路径> → 从索引移除(保留本地) ↓ 添加到 .gitignore → 防止未来重新跟踪 ↓ 提交变更 → 同步到远程仓库

本文作者:小明

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!