git clean用来清理工作区中未被追踪的文件和目录
它会删除那些不在Git索引里、也不在.gitignore里、且未被Git管理的文件
这些文件通常是:
- 编译生成的临时文件(如
.o,.class,.pyc) - 构建产物(如
bin/,dist/,node_modules/(如果没有将它们添加到.gitignore)) - 编辑器创建的备份文件或交换文件
这是一个危险命令,被它删除的文件通常无法恢复,它不涉及Git的历史记录,直接删文件
基本用法
git clean:Git会拒绝执行,并显示帮助信息git clean -ndry-run,列出会被删除的文件,但不执行git clean -f强制删除未追踪文件,只有强制执行才会执行删除git clean -d删除未追踪的目录,需要配合-f写为git -fdgit clean -x删除所有未追踪文件,包括.gitignore忽略的git clean -X删除只在.gitignore中忽略的文件,保留普通未追踪文件
常见组合
- 列出将删除的文件(删除之前先dry-run一遍)
git clean -nd
- 删除未追踪的文件和目录
git clean -fd
- 清理所有(包括.gitignore忽略的)
git clean -fdx
- 只清理.gitignore的产物
git clean -fdX
原理
git clean的逻辑类似于集合差集计算
- 收集Git已知的文件集合
- 从
.git/index读取所有被追踪的文件 - 从HEAD commit读取快照
- 扫描工作目录
- 遍历当前文件系统目录树
- 差集运算
- 如果判断文件是否是未追踪状态
- 过滤规则
- 根据参数过滤
- 根据
.gitignore、.git/info/exclude、core.excludesfile规则过滤
- 调用系统API删除
注意事项
- 不可逆操作
- 不会影响已追踪文件、暂存区和commit中的东西
- 用
.gitignore或.git/info/exclude标记不想被误删的文件