Git仍添加嵌套target目录中已忽略文件,重置后问题依旧
Rust嵌套项目Gitignore失效问题解决
问题背景
我的Rust项目.gitignore内容如下:
# Generated by Cargo # will have compiled files and executables */target/ */target/* # Performance stuff **/*.data **/*.data.old **/*.svg # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries # More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html Cargo.lock # These are backup files generated by rustfmt **/*.rs.bk
当前目录Git文件分布:
$ find . -name .git ./.git $ find . -name .gitignore ./.gitignore
新增嵌套项目后的结构:
|.gitignore |<other projects> |OneProject/ |--<other files> |--NestedProject |---- <other files> |---- target/ |------ <大量不需要的文件被加入Git>
操作过程:
推送时发现OneProject/NestedProject/target/下文件被加入,最初.gitignore只有*/target/,后来加了*/target/*但无效。执行git reset HEAD~1修改.gitignore后重新添加,文件仍被标记为已添加。切换新分支后执行:
git rm -rf --cached . git add . git commit -m "gitignore is now working" git push
但远程仓库依然存在该target目录下的文件。
问题原因
Gitignore规则不匹配嵌套目录
*/target/和*/target/*只能匹配当前目录下一级子目录里的target,比如OneProject/target/,但无法覆盖更深层级的OneProject/NestedProject/target/——*/只代表一层任意目录,不支持多层嵌套。清理步骤可能存在时序问题
如果修改.gitignore是在执行git rm -rf --cached .之后,那新规则并没有在git add .时生效,导致已追踪的嵌套target文件重新被加入暂存区。
正确解决步骤
- 修正Gitignore规则
把原有的*/target/和*/target/*替换成:
**/target/
**表示任意层级的目录,能匹配所有嵌套深度的target目录,自动忽略其下所有内容。
- 重新执行清理与提交
在新分支上按以下顺序操作:
# 清除所有已缓存的文件记录 git rm -rf --cached . # 按新的.gitignore规则重新添加文件 git add . # 提交变更 git commit -m "修复gitignore,忽略所有层级的target目录" # 推送到远程仓库 git push
- 验证结果
推送完成后,查看远程仓库的OneProject/NestedProject/路径,确认target目录及其中的文件已被移除。
内容的提问来源于stack exchange,提问作者Edward Peters
相关产品推荐
相关产品推荐

