在自动化工具-Web前端,CI系统中克隆git存储库时,有时git clone调用会打开提示询问用户名和密码(例如,在克隆不存在的Github存储库或缺少ssh密钥的新节点上时) )。
我如何使git失败(最好是显示明智的错误消息和退出代码),而不是等待服务器进程为其提供用户名和密码?
在自动化工具-Web前端,CI系统中克隆git存储库时,有时git clone调用会打开提示询问用户名和密码(例如,在克隆不存在的Github存储库或缺少ssh密钥的新节点上时) )。
我如何使git失败(最好是显示明智的错误消息和退出代码),而不是等待服务器进程为其提供用户名和密码?
Answers:
在git 2.3版中,有一个环境变量GIT_TERMINAL_PROMPT
,0
将其设置为时将禁止提示输入凭据。
您可以在man git
(更新为git version之后2.3
)或在github上的此博客文章中获得有关它的更多信息。
例子:
git clone https://github.com/some/non-existing-repo
将提示输入用户名和密码GIT_TERMINAL_PROMPT=0 git clone https://github.com/some/non-existing-repo
将在不提示输入用户名和密码的情况下失败从git版本1.8.3.1开始工作;
git clone -c core.askPass $echo url/or/path/to/git/repo
该配置core.askPass
通过将处理凭证的控制传递给上述程序来工作。但是,由于$echo
除输出外无法执行任何操作,因此克隆尝试将立即失败,并且将应用各个bash重定向。仅在git存储库恰好是私有的情况下才调用此代码,并且将通过管道输出错误,指出特定存储库的身份验证失败。您可以针对https://github.com/git/git
已知的私有存储库针对公共存储库进行测试。
为了达成协议,您甚至不需要像echo
最初那样引用程序。-c core.askPass
如果存储库恰好是私有的,则仅传递没有后续输入的git配置仍然会导致失败,因为代码将不知道将凭证处理卸载到哪个程序。虽然这肯定是比这里提到的其他方法更旧,更简单的方法,但我不知道它在旧版本的git中是否会产生相同的效果。
$echo
是一个变量引用(未设置)扩展为空字符串,因此它完全没有意义。如果您放在echo
那里(没有美元符号),那也将是不正确的,因为它将被解释为存储库位置。一定是-c core.askPass=echo
。
根据您运行git的方式,重定向stdin或stdout使其不连接到终端将阻止git提示输入详细信息,只会导致它出错。
这也将使您能够将错误(或至少是日志)暴露到Web服务。
</dev/null
和nohup .. &
不似乎工作。