Git 有没有类似 svn export 的导出功能

Git 的对应物是 git archive:git archive --format=zip -o out.zip HEAD 导出指定提交的纯净代码(不含 .git),支持 zip/tar 格式,也可导出子目录。GitHub 网页的 Download ZIP 同理。

最佳实践
Git 分支协作与合并示意

用 git archive:把指定分支/提交/tag 打包成不含 .git 的纯净代码包——这正是 svn export 的 Git 等价物。支持 zip 和 tar 格式,可以只导出子目录。

基本用法

git archive --format=zip -o release.zip HEAD          # 当前 HEAD 打成 zip
git archive --format=tar.gz -o v1.2.tar.gz v1.2.0     # 按 tag 打成 tar.gz
git archive HEAD:src/api | tar -x -C /tmp/api-only/   # 只导出子目录并解压

导出到目录(不打包)

git archive HEAD | tar -x -C /path/to/target/

远程仓库直接导出

git archive --remote=git@github.com:org/repo.git HEAD | tar -x
# 注意:GitHub 不支持 archive 的远程协议,此方式主要对自建 Git 服务有效

GitHub 上更简单的替代:网页点 Code → Download ZIP,或 curl -L https://github.com/org/repo/archive/refs/heads/main.zip。

构建发布包的场景

CI 里打发布包推荐:

git archive --format=tar.gz --prefix=myapp-1.2.0/ -o myapp-1.2.0.tar.gz v1.2.0

--prefix 让压缩包内所有文件带统一目录前缀,解包后结构干净。

常见问题(FAQ)

Q:git archive 会带 .gitignore 忽略的文件吗?

只打包被 Git 跟踪的文件,忽略文件自然不含。但注意 .gitattributes 里可用 export-ignore 进一步排除(如测试目录不进发布包)。

Q:能导出两个版本间变化的文件吗?

git diff --name-only A B | zip changes.zip -@ 组合一下即可——列出差异文件清单交给压缩工具。

Q:为什么不用直接复制目录再删 .git?

可以但笨拙:工作区可能有未提交改动、忽略文件混入。archive 从提交对象取内容,保证是干净精确的版本快照。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台