执行shell脚本中git add *命令报错fatal: pathspec '*?'未匹配文件,如何解决?
解决
git add *报错fatal: pathspec '*?' did not match any files的问题 你的问题主要来自两个核心原因:脚本换行符格式不兼容和**git add *的通配符解析局限性**,我来一步步帮你搞定:
一、错误原因拆解
- 换行符不兼容:从错误信息里的
*?和最后出现的' is not a git command能看出来,你的push.sh应该是在Windows编辑器里保存的,用了Windows风格的CRLF(\r\n)换行符。在WSL/Linux环境下,shell会把\r当成命令的一部分,导致git add *被解析成git add *?,git push也被附加了无效字符,引发命令识别错误。 git add *的隐患:*是shell层面的通配符,会被shell先解析再传给Git,不仅可能漏掉隐藏文件,遇到特殊文件名时还容易出现解析异常。
二、具体解决步骤
1. 修复脚本的换行符格式
把脚本的CRLF换行转换成Linux兼容的LF换行:
- 如果你的环境有
dos2unix工具,直接执行:dos2unix push.sh - 如果没有
dos2unix,用sed命令手动替换:sed -i 's/\r$//' push.sh
2. 替换git add *为更可靠的命令
推荐用git add --all(或简写git add -A)替代git add *,它会让Git自己处理所有变更(包括新增、修改、删除的文件),比shell通配符更稳定且覆盖范围全面。你也可以用git add .,但--all能处理更多场景(比如已跟踪文件的删除)。
修改后的push.sh建议加上shell指定头,避免环境差异:
#!/bin/bash git add --all git commit -m "Push everything from Laptop" git push
3. 验证与调试
修改完后重新执行脚本:
./push.sh
如果还是有问题,可以在脚本开头加上set -x开启调试模式,这样会输出每一步实际执行的命令,方便定位问题:
#!/bin/bash set -x git add --all git commit -m "Push everything from Laptop" git push
内容的提问来源于stack exchange,提问作者Chetu
相关产品推荐
相关产品推荐

