当在自动化工具(Web 前端、CI 系统)中克隆 git 存储库时,有时 git clone 调用会打开一个提示,要求输入用户名和密码(例如,当克隆不存在的 Github 存储库或在缺少 ssh 密钥的新节点上时)。
我怎样才能让 git 失败(最好带有合理的错误消息和退出代码),而不是等待服务器进程给它提供用户名和密码?
答案1
在 git 2.3 版本中有一个环境变量GIT_TERMINAL_PROMPT
,设置后将0
禁用提示输入凭据。
你可以在man git
(更新到 git 版本后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
将会失败,不会提示输入用户名和密码
答案2
如何跳过,忽略和/或拒绝git 凭证提示
当使用 Git-for-Windows 时,上述答案仅对我有部分作用:二不同的应用程序通过自动化的 git pull/push 脚本争夺我的注意力:
- git-credentials-manager(由 GfW 团队 AFAICT 开发;具有干净的灰色 Windows 界面外观)
- 另一个对话框,其祖先肯定具有一些(看起来很糟糕的) X-Windows 基因。
让他们都闭嘴,没有卸载凭据管理器,如下面一些答案中提到的那样:https://stackoverflow.com/questions/37182847/how-do-i-disable-git-credential-manager-for-windowsbash
,下面是现在可以运行的内容,位于自动化 ( ) shell 脚本之上:
# https://serverfault.com/questions/544156/git-clone-fail-instead-of-prompting-for-credentials
export GIT_TERMINAL_PROMPT=0
# next env var doesn't help...
export GIT_SSH_COMMAND='ssh -oBatchMode=yes'
# these should shut up git asking, but only partly: the X-windows-like dialog doesn't pop up no more, but ...
export GIT_ASKPASS=echo
export SSH_ASKPASS=echo
# We needed to find *THIS* to shut up the bloody git-for-windows credential manager:
# https://stackoverflow.com/questions/37182847/how-do-i-disable-git-credential-manager-for-windows#answer-45513654
export GCM_INTERACTIVE=never
什么没有奏效
- 所有咒语
git config credential.modalprompt false
--在对那个链接的 SO 问题的回答中被提及作为解决方案。没有骰子为我。 - 摆弄那个
GIT_SSH_COMMAND
环境变量:没有什么作用,但是保留它,因为我怀疑它会在 Linux 而不是 Windows 上运行这个东西时启动。 GIT_TERMINAL_PROMPT=0
:也不需要工作。出于同样的原因,但没有骰子在 Windows 上。
哦,还有卸载git 凭证管理器,正如其他答案中所建议的那样,在该 SO 链接中被决定为不行选项,因为它肯定会影响此内容所在的其他存储库树可能有一天会有用的。虽然我考虑了一会儿,但还是决定不这样做。
什么确实有效
- 弄乱这两个
*_ASKPASS
环境变量,奇怪的是,关闭了“X-Windows 查找”登录提示(自动)git push
。耶! GCM_INTERACTIVE=never
是最终让 git-for-windows 凭据管理器对话框闭嘴的神奇因素。多亏了这个特别的答案 (https://stackoverflow.com/questions/37182847/how-do-i-disable-git-credential-manager-for-windows#answer-45513654),虽然它不在列表的首位,但对我而言绝对是最重要的。
我的 git 版本
$ git --version
git version 2.30.1.windows.1
离别笔记
<rant>
多年来,我一直在断断续续地寻找这些信息:这次显然我很幸运,也许坚持了更长时间(?),翻阅了无数页关于配置你的凭证:谷歌显然是不是很聪明。至少它不太听少数人的问题,这是肯定的。</rant>
添加标题是希望谷歌索引将这个页面放在更高的位置,以便下次寻找这些问题的答案或其变体......
答案3
如果您使用 ssh 身份验证,并且在 Linux 上,那么您可以创建一个 ssh 命令替换来禁用此功能。
创建一个名为“sshnoprompt.sh”的文件,其中包含:
ssh -oBatchMode=yes $@
使用以下命令使此文件可执行chmod +x sshnoprompt.sh
然后启动 git 时:
GIT_SSH="sshnoprompt.sh" git clone foo@dummyserver:not_a_repo
并且它不允许任何交互式 git 提示或问题 —— 它不应该向用户询问任何事情。
答案4
从 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 中是否会有同样的效果。