Azure Pipeline Bash任务执行git命令返回127错误如何解决
问题根因
报错和git安装、PATH配置、仓库权限均无关,核心原因是Bash脚本内git命令与后续子命令、参数之间混入了不可见的不间断空格(NBSP,Unicode U+00A0),而非普通半角ASCII空格:
- 错误日志可直接佐证:第一行报错是git程序本身输出的,提示
'add /Users/runner/work/1/s/MyFilePath/my.file' is not a git command,说明git已经被正常启动,只是shell没有识别到git和add之间的特殊字符为命令分隔符,把add+文件路径整体当成了传给git的子命令名;后续commit、push行的报错是bash直接抛出的命令不存在,同样是因为git和子命令之间的特殊字符没被当成分隔符,整串git commit -m xxx被识别为一个独立的可执行文件名,自然查找不到返回127退出码。 - 此前配置的
git checkout步骤能正常运行,是因为该段脚本内的空格均为正常半角空格,没有混入特殊不可见字符。这类特殊空格通常是从富文本文档、网页、聊天窗口复制配置内容时自动带入的,肉眼无法直接识别。
修复步骤
- 清空现有Bash@3任务内script字段的所有内容,不要保留原有复制来的命令行,手动逐字符敲入所有git命令,确保所有命令、参数之间的空格都是键盘直接输入的普通半角空格。
- 修正后的任务配置参考如下:
- task: Bash@3 inputs: targetType: 'inline' script: | echo $PATH git add $(System.DefaultWorkingDirectory)/MyFilePath/my.file git commit -m "update file [skip ci]" git push origin HEAD:$(Build.SourceBranchName) workingDirectory: '$(Build.SourcesDirectory)' displayName: 'Git commit' continueOnError: true condition: and(succeeded(), eq(variables.ChangeFile, 'true'))
- 额外适配:
git push后显式指定推送目标为HEAD:$(Build.SourceBranchName),可以避免流水线检出处于detached HEAD状态时推送无目标分支的问题。
验证方法
如果需要确认特殊字符是否清理干净,可以在脚本开头加一行cat -A $0,执行后会打印当前运行的临时脚本内容:普通半角空格会显示为空白,不间断空格会显示为M-BM-标记,确认无特殊字符后即可正常执行。
内容的提问来源于stack exchange,提问作者UnreachableCode
相关产品推荐
相关产品推荐

