zip递归压缩需用归档路径写法:-x "/.git/"正确(zip 3.0+支持*),-x ".git/"错误(缺前缀);排除多目录可叠加-x,或用find预筛文件列表更可靠。

直接用 zip -r site.zip ./myweb/ -x ".git/*" 就能完成,但实际中容易漏掉或失效——关键在于路径写法、通配层级和隐藏目录的特殊性。
排除 .git 目录必须用归档路径写法
zip 内部存储的路径是相对路径,不含 ./,也不自动递归匹配。比如 myweb/.git/config 在压缩包里存为 myweb/.git/config,所以:
- ✅ 正确:-x "myweb/.git/*"(明确写出目录前缀)
- ✅ 更通用:-x "**/.git/*"(
**表示任意层级前缀,zip 3.0+ 支持该语法) - ❌ 错误:-x ".git/*"(没带
myweb/前缀,匹配不到) - ❌ 错误:-x "./.git/*"(
./不在归档路径中,永远不生效)
确保递归生效且不漏子目录
只加 -r 不够,还要注意两点:
- 必须从站点根目录执行命令,或显式指定完整相对路径;例如进入
myweb目录后运行:zip -r ../site.zip . -x ".git/*" - zip 默认会跳过以
.开头的隐藏目录,但.git是特例——它虽被跳过,但若你手动包含或路径写错,反而可能部分混入;所以显式排除更可靠 - 加
-q可静默运行,避免大量文件名刷屏:zip -rq site.zip myweb/ -x "**/.git/*"
一次排除多个常见干扰项
Web 站点常还需排除 .DS_Store、node_modules、日志等,可叠加多个 -x:
zip -rq site.zip myweb/ -x "**/.git/**" -x "**/node_modules/**" -x "**/.DS_Store" -x "**/*.log"- 每个
-x后跟一个模式,不能用逗号或空格合并 - 模式用双引号包裹,防止 shell 提前展开通配符
更稳妥的做法:用 find 预筛文件列表
当排除规则复杂或需精确控制时,绕过 zip 自身通配限制:
find myweb/ -type f ! -path "myweb/.git/*" ! -name "*.log" ! -name ".DS_Store" | zip site.zip -@-
-@表示从标准输入读取文件路径列表 - 这种方式完全避开
-x的路径匹配歧义,适合 CI/CD 脚本复用



















