最可靠方式是绕过IDE GUI,用tar命令精准排除非代码文件:tar --exclude='./.idea' --exclude='./.git' --exclude='./vendor' -czf myproject-source.tar.gz .

直接导出纯净源码,不带 .idea、vendor、.git 等非代码文件,最可靠的方式是**绕过 PhpStorm GUI,用命令行打包**。GUI 的 Export to Zip 默认会跳过 .idea,但无法灵活排除 logs/、node_modules/、tests/ 等目录,且不支持按规则过滤隐藏文件。
为什么不用 File → Export to Zip
这个菜单项看似方便,但实际限制多:
- 不支持自定义排除规则(比如你想去掉所有
*.log或coverage/) - “导出整个项目”选项仍可能包含
.env、phpunit.xml.dist这类敏感或非生产文件 - Windows/macOS 下右键压缩虽快,但 Linux 服务器环境或 CI 流程中不可控
- 导出的 ZIP 里若含符号链接或特殊权限,解压后可能失效
推荐:用 tar 命令排除 IDE 和临时文件
在项目根目录执行以下命令,能精准控制内容:
tar --exclude='./.idea' \
--exclude='./.git' \
--exclude='./vendor' \
--exclude='./node_modules' \
--exclude='./logs' \
--exclude='./tmp' \
--exclude='./tests' \
--exclude='./.env' \
-czf myproject-source.tar.gz .
说明:
-
--exclude必须写成./xxx格式,相对路径才生效;写成.idea(无点斜杠)可能被忽略 -
-c创建归档,-z用 gzip 压缩,-f指定输出文件名 - 如果项目用 Composer,且你希望保留
composer.json但删掉vendor,上面已覆盖 - 想保留
.env.example?加一行--exclude='./.env' --include='./.env.example'不起作用 ——tar不支持 include 与 exclude 混用,改用find配合更稳妥
需要保留部分隐藏文件(如 .htaccess)时怎么处理
默认 tar 会打包所有以 . 开头的文件(除了被 --exclude 明确剔除的)。如果你只想要 .htaccess 和 .gitignore,但不要 .editorconfig,就得换策略:
- 先生成白名单文件列表:
find . -maxdepth 1 -name '.htaccess' -o -name '.gitignore' -o -type f ! -name '.*' | sed 's|^\./||' > filelist.txt - 再用
tar -T filelist.txt -czf clean.tar.gz - 注意:
find结果含路径前缀(如./src/index.php),sed去掉./才能被tar -T正确读取
自动化场景下避免手动敲命令
CI 脚本或部署钩子里,建议把打包逻辑封装成可复用的 shell 函数:
pack_source() {
local out="${1:-project.tar.gz}"
tar --exclude='./.idea' --exclude='./.git' --exclude='./vendor' \
--exclude='./node_modules' --exclude='./logs' \
-czf "$out" .
}
pack_source "release-$(date +%Y%m%d).tar.gz"
关键点:
- 变量
$out用双引号包裹,防路径含空格时报错 - 日期格式用
%Y%m%d而非%F,避免某些旧版date不支持 - 别在脚本里写死项目路径 —— 运行前
cd /path/to/project更安全
真正容易被忽略的是:很多团队导出后直接丢进 Docker 构建上下文,却忘了 .dockerignore 里没同步排除这些目录,导致构建缓存失效或镜像臃肿。导出源码只是第一步,后续环节得连着看。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










