Git Archive处理含空格文件名报错,引号包裹无效求解决办法
解决Git Archive处理带空格路径失败的问题
我太懂你这种被带空格文件名坑到的滋味了!之前你尝试用引号包裹路径、加反斜杠转义都没用,核心问题出在shell的命令替换分词机制上——当你用$(...)把git diff的结果传给git archive时,shell会把输出里的空格当作分隔符拆分路径,哪怕你用awk给文件名加了引号,shell也会把引号当作普通字符去掉,照样拆分,自然就找不到文件了。
正确的解决办法:用--stdin让Git直接读取路径列表
Git的archive命令支持--stdin参数,它会从标准输入读取要归档的路径(每行一个路径),这样就能完美保留路径里的空格、特殊字符,不会被shell拆分。
直接用这条命令就行:
git diff --name-only 33ab7ac^..a2c79b2 --diff-filter=ACMRTUX | git archive -o upload.zip a2c79b2 --stdin
原理说明
git diff --name-only ...会输出所有符合条件的文件名,每行一个,带空格的文件名也会完整占一行;- 管道把这些文件名直接传给
git archive --stdin,Git会按行读取每个路径,完全不会被shell的分词逻辑干扰; - 最后
git archive就会把指定提交(a2c79b2)里的这些文件打包成upload.zip。
你可以先单独运行git diff --name-only 33ab7ac^..a2c79b2 --diff-filter=ACMRTUX,确认输出的文件名都是每行一个,带空格的路径也完整显示,再执行上面的完整命令,肯定就能成功啦!
内容的提问来源于stack exchange,提问作者Hamed
相关产品推荐
相关产品推荐

