git archive可直接导出不含.git目录的纯净代码包,它从对象数据库读取指定提交快照,不依赖工作区、不checkout、自动遵循.gitignore规则,支持按tag/commit/分支/子目录打包,并可通过--prefix等参数控制输出格式。

直接用 git archive 就能导出不含 .git 目录的纯净代码包,它不碰工作区、不 checkout、不依赖本地修改,天然规避容器镜像中混入 Git 元数据的风险。
核心命令:一键生成安全交付包
最简可靠写法:
-
git archive --format=zip --output=app-prod.zip v2.1.0—— 按 tag 打包,解压即用 -
git archive --format=tar.gz --output=dist.tar.gz main --prefix=myapp/—— 加前缀防文件散落,适合构建 Docker 镜像时 COPY -
git archive --format=tar.gz --output=src.tar.gz HEAD:src/—— 只打包子目录,精准控制交付范围
关键细节:为什么它比 cp / git clone 更安全
git archive 从 Git 对象数据库直接读取指定提交的快照,跳过整个工作区和暂存区。这意味着:
- 无论你本地有没有
.git/config、.git/modules/或未提交的敏感文件,它们都不会出现在归档里 -
.gitignore中的规则自动生效,被忽略的密钥、日志、IDE 配置等默认不打包 - 没有
.git目录、没有.gitattributes注释、没有隐藏的钩子脚本——输出就是纯源码树
进阶控制:适配生产环境需求
常见增强场景:
- 需包含
.gitignore文件(如供第三方构建):加--add-file=.gitignore(Git 2.39+) - 中文路径在容器内解压乱码:改用
--format=tar.gz,或加--worktree-attributes配合export-ignore过滤 - 排除某些被跟踪但不该进生产的文件(如本地配置模板):在
.gitattributes中写config.local export-ignore - 校验归档完整性:打包后运行
unzip -t app-prod.zip >/dev/null && echo "OK"
集成到 Docker 构建流程
推荐在 Dockerfile 中使用多阶段构建,或先在 CI 中生成归档再 COPY:
- CI 脚本示例:
git archive --format=tar.gz --output=/tmp/app.tgz v$(VERSION) && docker build --build-arg APP_TAR=/tmp/app.tgz . - Dockerfile 内:
COPY --from=builder /tmp/app.tgz /tmp/ && tar -xzf /tmp/app.tgz -C /app --strip-components=1 - 避免写
COPY . /app—— 这会把本地所有文件(包括 .git)一股脑塞进镜像











