这个场景解决什么
给项目或站点打包时,版本库目录、依赖缓存、编译产物与本地日志都没有交付价值,却会让包体显著变大、甚至把敏感配置一起带出去。tar 提供了按模式排除的选项与排除清单文件,把规则固定下来之后,每次打包都能得到干净、可预期、体积合理的产物。
基本信息
| 场景 | 按模式排除目录与文件后再打包 |
|---|---|
| 常用选项 | --exclude 单个模式、-X 从文件读排除清单、--exclude-vcs 排除版本库目录、--exclude-caches 排除带标记的缓存目录 |
| 匹配对象 | 归档成员名(可能带你在命令里写的前缀),与文件系统上的绝对路径不是一回事 |
| 验证方式 | 打包后立刻用 tar -t 核对清单,确认该排除的都排除了 |
典型使用场景
- 源码交付:排除版本库目录与编译产物,交付内容只保留源文件
- 站点备份:排除缓存、会话、日志,压缩包体积可缩小数倍
- 合规交付:确保密钥、环境变量文件等敏感内容不进入分发包
- 多项目复用:把常用排除规则写成清单文件,各项目共用同一份
- 增量思路:先用小范围试打包,确认规则生效再对全量执行
常用示例
常用示例
tar -czf src.tar.gz --exclude-vcs --exclude='*.pyc' project/
tar -czf site.tar.gz --exclude='./cache' --exclude='./logs/*.log' -C /data site
tar -czf data.tar.gz -X /opt/ops/exclude.lst -C /data site
tar -czf app.tar.gz --exclude='*/node_modules' --exclude='*/.git' -C /srv app
# 打包后立刻核对:先看清单,再统计不该出现的目录
tar -tzf site.tar.gz | head -30
tar -tzf site.tar.gz | grep -cE 'cache|node_modules|/\.git/'排除清单文件写法
排除清单文件写法
# /opt/ops/exclude.lst 一行一个模式,空行与注释行按需管理
*.log
*.tmp
*/cache/*
*/node_modules
*/.git
*/dist/tmp排除相关选项
| 选项 | 作用 | 注意 |
|---|---|---|
| --exclude=模式 | 排除匹配的成员 | 含通配符时建议加引号,避免 shell 提前展开 |
| -X 文件 | 从清单文件批量读取模式 | 适合规则多的场景,便于评审与复用 |
| --exclude-vcs | 排除常见版本库目录 | 一次覆盖主要版本控制系统的元数据 |
| --exclude-caches | 排除含缓存标记的目录 | 依赖目录内的标记文件存在 |
| --exclude-backups | 排除常见的备份后缀文件 | 能挡住编辑器遗留的临时文件 |
| -C 目录 | 切换打包根目录 | 影响成员名,进而影响模式匹配结果 |
排除模式匹配的是归档成员名,而这与你在命令里写的前缀有关。规则写完先打一个小包、用 tar -t 核对,比反复猜测匹配规则高效得多。
排除规则写错的代价不只是包变大:.env、密钥文件、数据库配置被打进交付包,等于把凭据送出内网。交付前检查清单是必要环节,不能只靠规则本身。