Git 有没有类似 svn export 的导出功能
Git 的对应物是 git archive:git archive --format=zip -o out.zip HEAD 导出指定提交的纯净代码(不含 .git),支持 zip/tar 格式,也可导出子目录。GitHub 网页的 Download ZIP 同理。
用 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 从提交对象取内容,保证是干净精确的版本快照。