发布前用 git archive 检查源码包内容

44 次浏览2 条回复

如果项目要给别人源码包,直接把工作目录压缩有时会把 .git、本地配置或构建产物一起带进去。可以让 Git 按仓库版本生成归档:

环境:Git 2.25+,在已有提交的仓库里执行。

git archive --format=tar.gz --prefix=demo-1.0.0/ -o demo-1.0.0.tar.gz HEAD
tar -tzf demo-1.0.0.tar.gz | head

它只会打包提交里的文件,不包含 .git 目录;仓库里标了 export-ignore 的路径也会被排除。先用 tar -tzf 看清单,再上传或交给构建流程。

如果归档里需要版本号,可以把 HEAD 换成 tag,例如 v1.0.0。未提交的本地改动不会出现在包里,这点发布前最好确认一下。

这个命令还有个小坑:如果是靠 .gitattributes 里的 export-ignore 排除文件,最好确认这份 .gitattributes 本身已经提交了。

比如临时在本地加了一行:

secrets.example export-ignore

但还没提交,然后用 git archive HEAD,结果可能和预期不一致。发布前我一般会先看一下:

git status --short .gitattributes
tar -tzf demo-1.0.0.tar.gz | grep -E 'secrets|env'

清单确认一眼,比发出去之后再补包省事。

补充一个容易漏的点:仓库用了 Git submodule 时,git archive 只会打包主仓库里的 gitlink,不会把子模块源码递归放进压缩包。发布前可以先看归档清单里有没有子模块目录;如果交付物必须自包含,就得在打包流程里单独处理子模块,不能只看主仓库命令成功了没。