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
mkdir -p /tmp/api-only
git archive HEAD:src/api | tar -x -C /tmp/api-only/   # 只导出子目录并解压

导出到目录(不打包)

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

远程仓库直接导出

git archive --remote=git@git.example.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。

子模块内容不会自动递归导出;Git LFS 也可能只得到指针文件,取决于本地/托管导出实现。发布前核对实际归档内容。

构建发布包的场景

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 忽略的文件吗?

从指定树对象打包,未跟踪文件不包含;已跟踪文件即使匹配 .gitignore 仍会打包。但注意 .gitattributes 里可用 export-ignore 进一步排除(如测试目录不进发布包)。

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

不能直接把差异路径交给 zip 当作 B 的快照,它读取的是当前工作区,且删除路径不存在。可先从 B 导出到独立目录,再按可靠的 NUL 分隔差异清单挑选新增/修改文件,并另存删除清单;含重命名也需明确处理。

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

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

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台