Git忽略含CRLF换行的.git-credentials凭证,如何解决?
Git Credential Store 兼容Windows CRLF换行问题解决方案
问题背景
- Jenkins流水线动态创建Windows虚拟机,通过HTTPS克隆私有GitHub仓库(IT强制禁用SSH),已配置Git自动转换SSH URL为HTTPS:
[url "https://github.com/"] insteadOf = git@github.com: - 因不能修改
.gitmodules(避免破坏开发人员的SSH访问流程),采用credential.helper=store从明文文件.git-credentials读取凭证(虚拟机任务完成即销毁,无安全风险)。
核心问题
使用Windows命令行echo https://%GIT_TOKEN%@github.com>%UserProfile%\.git-credentials写入凭证时,文件会带有CRLF换行符,导致Git忽略该行并触发手动账号密码输入;改用LF换行符则可正常读取。
可行解决方案
一、配置Git兼容CRLF换行(不推荐)
Git的credential.helper=store默认仅识别LF换行,但可通过修改Git的换行处理配置强制兼容:
# 全局配置,影响所有仓库 git config --global core.autocrlf input # 或仅针对当前仓库配置 git config core.autocrlf input
注意:该配置会改变Git对所有文本文件的换行转换规则,可能引发其他文件的换行符意外变更,仅在确认无副作用时使用。
二、直接写入LF格式的凭证文件(推荐)
1. PowerShell 命令
利用PowerShell的输出控制直接生成LF换行的文件:
# 写入凭证内容并添加LF换行 Add-Content -Path "$env:USERPROFILE\.git-credentials" -Value "https://$env:GIT_TOKEN@github.com`n" -Encoding ascii
或者分步写入:
# 先写入无换行的凭证内容 "https://$env:GIT_TOKEN@github.com" | Out-File -FilePath "$env:USERPROFILE\.git-credentials" -Encoding ascii -NoNewline # 手动添加LF换行符 "`n" | Out-File -FilePath "$env:USERPROFILE\.git-credentials" -Encoding ascii -Append -NoNewline
2. CMD 命令
通过set /p避免默认的CRLF换行,配合二进制复制生成LF格式文件:
# 生成临时文件,写入无换行的凭证内容 echo|set /p="https://%GIT_TOKEN%@github.com" > temp.txt # 添加LF换行符(注意:此处的换行需手动输入LF,或在PowerShell环境下执行该命令) echo.|set /p="^ " >> temp.txt # 二进制模式复制到目标文件,避免自动转换换行 copy /b temp.txt %UserProfile%\.git-credentials # 删除临时文件 del temp.txt
三、将已生成的CRLF文件转换为LF
1. PowerShell 转换命令
# 读取文件内容,替换CRLF为LF后重新写入 (Get-Content "$env:USERPROFILE\.git-credentials" -Raw) -replace "`r`n", "`n" | Set-Content "$env:USERPROFILE\.git-credentials" -Encoding ascii -NoNewline
2. 使用Git自带的dos2unix工具
Git for Windows默认包含dos2unix工具(需确保Git路径已加入系统PATH):
dos2unix %UserProfile%\.git-credentials
内容的提问来源于stack exchange,提问作者OmniZ
相关产品推荐
相关产品推荐

