You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins拉取Git代码新增DOS换行符导致Shell脚本报bad interpreter错误

问题根因

你之前在本地调整文件格式的操作无效,核心原因是问题出在Jenkins节点的Git客户端行尾转换逻辑:当Jenkins节点(多为Windows系统)的Git配置开启了自动行尾转换时,即使GitHub上的文件是LF格式,拉取到本地工作区时Git会自动将LF转换为CRLF,和源文件本身的格式无关。

解决方案

方案1:调整Jenkins节点的Git全局配置

  • 登录到Jenkins执行拉取代码的节点(主节点就登录主节点,agent节点就登录对应agent)
  • 执行命令关闭自动换行转换:git config --global core.autocrlf false
  • 可选执行配置强制统一行尾格式:git config --global core.eol lf
  • 配置完成后删除Jenkins任务的旧工作区,重新触发构建验证即可。

方案2:仓库内添加.gitattributes规则(优先级最高、跨环境生效,更推荐)

该方案不需要修改Jenkins节点配置,只要在代码仓库根目录添加.gitattributes文件,规则会覆盖所有环境的Git本地配置,从根源避免不同节点行尾配置不一致的问题:

  • 在你的代码仓库根目录新建.gitattributes文件,写入以下内容:
# 所有Shell脚本强制使用LF行尾,签入签出都不做转换
*.sh text eol=lf
# yml配置类文件也可指定统一使用LF
*.yml text eol=lf
# 二进制文件不做任何转换
*.zip binary
*.png binary
  • 将该文件提交推送到GitHub,后续Jenkins再拉取代码时,会按照规则保留Shell脚本的LF换行,不会自动转成CRLF。

方案3:Jenkins构建步骤增加兜底转换逻辑

如果前两个方案因权限等问题无法实施,可以在Jenkins任务的构建步骤最前面(拉取代码之后、打包上传S3之前)增加批量转换命令:

  • 若Jenkins节点安装了dos2unix工具,添加命令:find . -name "*.sh" -exec dos2unix {} \;
  • 若未安装dos2unix,可使用sed实现转换:find . -name "*.sh" -exec sed -i 's/\r$//' {} \;

内容的提问来源于stack exchange,提问作者Subbu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:45:02