git clone-失败,而不是提示输入凭据


14

在自动化工具-Web前端,CI系统中克隆git存储库时,有时git clone调用会打开提示询问用户名和密码(例如,在克隆不存在的Github存储库或缺少ssh密钥的新节点上时) )。

我如何使git失败(最好是显示明智的错误消息和退出代码),而不是等待服务器进程为其提供用户名和密码?


我们建立了一个多服务器Jenkins,它烦人地坐在那里等待提示,直到它在缺少ssh密钥的新服务器上运行时被杀死-一种配置它只会因消息而失败并且退出代码为非零的方式将失败有用。
Danny Staple 2013年

如果捕获全部“批处理”模式也可以用来禁止提示输入主机密钥,这将是理想的选择。
Danny Staple 2013年

Answers:


15

在git 2.3版中,有一个环境变量GIT_TERMINAL_PROMPT0将其设置为时将禁止提示输入凭据。

您可以在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的el7服务器上使用https git clone返回此处。检查是否可以从另一个仓库更新到2.0。
Danny Staple

0

如果在Linux上使用ssh身份验证,则可以创建ssh命令替换来禁用此功能。

使用以下命令创建一个名为“ sshnoprompt.sh”的文件:

ssh -oBatchMode=yes $@

使此文件可执行 chmod +x sshnoprompt.sh

然后在启动git时:

GIT_SSH="sshnoprompt.sh" git clone foo@dummyserver:not_a_repo

而且它将不允许任何交互式git提示或问题-它不应向用户询问任何内容。


0

从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
MichałGórny

-1

根据您运行git的方式,重定向stdin或stdout使其不连接到终端将阻止git提示输入详细信息,只会导致它出错。

这也将使您能够将错误(或至少是日志)暴露到Web服务。


我将如何去做呢?试图在猛砸首先做到这一点,无论</dev/nullnohup .. &不似乎工作。
TinTvrtković13年

如果没有一个具体的示例如何实现此目的,此答案将无济于事。如上所述,尤其是“显而易见”的方法不起作用。
MichałGórny

@MichałGórny几年前我还没有看到过OP的问题,但是问题(操作系统,工具集)中没有足够的信息来回答。重定向标准输入和标准输出。自从提出问题以来,Git发生了很大变化(例如,在Windows上,如果要连接到Azure DevOps,它将弹出外部对话框以显示凭据),因此最好使用顶部答案中列出的环境变量
Matthew Steeples
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.