首页/系统/Linux 运维命令速查/场景:打包排除缓存与版本库
文件与目录76 条

场景:打包排除缓存与版本库

给源码/站点打包时排除 .git、node_modules、日志与缓存,包体更小、交付更干净。

Linux 运维命令速查系统更新于 2026-10-13

这个场景解决什么

给项目或站点打包时,版本库目录、依赖缓存、编译产物与本地日志都没有交付价值,却会让包体显著变大、甚至把敏感配置一起带出去。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、密钥文件、数据库配置被打进交付包,等于把凭据送出内网。交付前检查清单是必要环节,不能只靠规则本身。

易错点

  • 把 --exclude 放在路径参数之后:部分场景下行为不符合预期,写在路径之前更稳
  • 模式不加引号:shell 会先展开含星号的模式,排除规则失效且没有任何报错
  • 只用 -C 改变根目录却按绝对路径写模式:匹配对象是成员名,写错等于没排除
  • 打包后不核对清单:该排除的没排除、敏感文件被打包这类问题,只有在核对时才会暴露

数据来源与参考

  • man 1 tar(GNU tar 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌