基于 Git 打包纯净源码
有时候想打一个“纯净源码包”:
-
不要
.git目录 -
不要未跟踪且被忽略的文件
-
只保留当前版本真正受 Git 管理的源码
-
且有可能需要处理仓库嵌套的情况
想直接用可以看最终的脚本。
嵌套仓库
如果项目只有一个标准 Git 仓库,直接在根仓库跑git archive往往就够了。但有时存在嵌套:
-
根仓库为了避免重复管理,把某些子目录整体写进了
.gitignore -
这些被忽略的目录里,自己又各自初始化了 Git 仓库
这时如果只在根仓库执行:
git archive --format zip -o source.zip HEAD
会发现根仓库里被忽略的子仓库,不会进压缩包。
因为git archive只认识“当前仓库已跟踪的文件”,不会跨到别的 Git 仓库里继续收集源码。
我最后采用的做法
核心思路很简单:
-
先自动扫描项目目录下有哪些 Git 仓库
-
对每个仓库只取
git ls-files返回的已跟踪文件 -
根仓库导出一份
-
子仓库也各自导出一份,并放回它们在项目中的原始相对路径
-
最后把这些内容合并后再压缩
这样做有几个直接好处:
-
不会包含
.git -
不依赖人工排除
node_modules、dist、日志、临时文件 -
即使项目是多仓库嵌套,也能得到完整源码包
写了一个脚本,自动扫描某个项目根目录下的所有 Git 仓库,然后按各仓库在项目中的原始相对路径导出已跟踪文件,最后打成 zip。
总结
单仓库项目优先试git archive,多仓库嵌套项目则先自动扫描仓库,再分别取各仓库的git ls-files结果合并压缩。
