如何跳过,忽略和/或拒绝git 凭证提示

如何跳过,忽略和/或拒绝git 凭证提示

当在自动化工具(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 链接中被决定为不行选项,因为它肯定会影响此内容所在的其他存储库树可能有一天会有用的。虽然我考虑了一会儿,但还是决定不这样做。

什么确实有效

我的 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 中是否会有同样的效果。

相关内容