如何使用git archive命令打包未被Git跟踪的目录?
报错原因
git archive 从设计上就只会打包Git提交树里已追踪的文件,根本不会处理未入库的内容,报错原因非常明确:
/build目录被加入.gitignore后从未提交到Git版本库,HEAD指向的提交树里根本不存在这个路径- 执行
git archive --format=zip HEAD ./build > deploy.zip时,Git会先去HEAD的提交树里查找./build路径,查找失败又识别到该目录是未追踪状态,直接抛出fatal: current working directory is untracked错误 - 尝试的
--add-file方案写法有误:命令末尾追加的./build/参数依然会触发Git从提交树查找路径的逻辑,和--add-file追加本地未追踪文件的逻辑冲突,无法正常运行。
实现方法
基于git archive的实现方案
该方案要求Git版本≥2.38,--add-file参数是这个版本才新增的特性,支持向压缩包中追加未被Git追踪的本地文件,具体用法分两种场景:
- 场景1:需要同时打包仓库已追踪的源码 + build目录
执行命令时不要在尾部追加./build这类从提交树提取内容的路径参数,避免触发查找逻辑:git archive --format=zip --add-file=build HEAD > deploy.zip - 场景2:仅需要打包build目录,不需要带入仓库其他源码
直接基于Git内置的固定空树哈希生成空压缩包,再追加build目录即可,不会带入任何多余的版本库文件:git archive --format=zip --add-file=build 4b825dc642cb6eb9a060e54bf8766f636024a158 > deploy.zip
CI环境通用兼容方案
如果CI环境的Git版本低于2.38,无法使用--add-file参数,之前使用的zip命令本身是可行的。如果不想手动维护node_modules这类排除规则,可以结合Git命令自动读取.gitignore规则生成排除列表,适配性更强:
zip -r deploy.zip ./build -x "*.git/*" $(git ls-files --others --ignored --exclude-standard | sed 's/ /\\ /g')
该命令会自动排除所有被.gitignore标记的文件,不需要手动维护排除项列表。
内容的提问来源于stack exchange,提问作者contool
相关产品推荐
相关产品推荐

