git push 在 bash 中使用 ssh-agent 但不是 gui

Posted

技术标签:

【中文标题】git push 在 bash 中使用 ssh-agent 但不是 gui【英文标题】:git push using ssh-agent in bash but not gui 【发布时间】:2019-10-29 11:53:09 【问题描述】:

使用 git for windows (git-scm.com) 和脚本,我可以让 Bash 停止询问密码,但我似乎无法从 git GUI 中删除密码提示。

远程的 url 使用 ssh 链接(见下文),所以我很确定这不是问题。但我不是 git 和 SSH 方面的专家..

git@gitlab.com:repo

已使用提供的密码创建 SSH 密钥 (ED25519),并将公钥添加到主机帐户。 SSH 密钥存储在典型位置C:\Users\<user>\.ssh\id_ed25519。在 GUI 中单击 Help->Show SSH Key 时,它会显示我正在使用的 ssh 密钥。 ssh-agent 正在后台运行,并且 ssh 密钥已通过以下设置添加到 ssh-agent。

设置 ssh-agent 我使用了here 提供的代码(复制并粘贴在下面以供参考)在C:\Users\<user> 路径下创建.bashrc 文件。在 bash 提示下,一切似乎都按预期运行,但在 Git GUI 下却没有。

env=~/.ssh/agent.env

agent_load_env ()  test -f "$env" && . "$env" >| /dev/null ; 

agent_start () 
    (umask 077; ssh-agent >| "$env")
    . "$env" >| /dev/null ; 

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add
fi

unset env

在我看来,在执行推送、获取或任何其他相关远程功能时,Git GUI 似乎没有使用 ssh-agent。在设置 ssh-agent、.bashrc 脚本和/或 GUI 以完成删除密码提示时,我是否遗漏了一个步骤?还是有其他事情发生?

非常感谢任何和所有帮助,在此先感谢

【问题讨论】:

哪个 Git GUI?你输入什么命令来启动那个 Git GUI?你是从 bash 会话中输入的吗? 使用 git for windows (git-scm.com)。通常我从上下文窗口启动 GUI(右键单击 Windows 资源管理器中的文件夹)。然后在整个工作流程中执行暂存、提交和/或推送的典型用法。然后关闭窗口直到下一次。 @VonC,这确实带来了好处。有趣的是,如果 git GUI 使用 git gui 命令从 bash 启动,git GUI 会停止询问 ssh 密码... 是的,从上下文菜单中,它可以使用“所有用户”或“系统”帐户,它们没有像您自己的 C:\Users\<user> 那样的 ~/.ssh 文件夹。 【参考方案1】:

.bashrc 在您启动 Git Bash 时运行。这仅影响 bash 环境,但对整个 Windows 没有任何作用。当您运行 GUI 时,.bashrc 中的任何设置都不起作用。我在我的 Windows 笔记本电脑上使用 IntelliJ 中的 Git 集成,但仍然不知道如何使用我的 SSH 密钥。我目前打开 Git Bash 来拉取、推送或任何与遥控器交互的东西。

【讨论】:

虽然这是预期的一半并且没问题(因为我可以在启动/登录时运行 bash 脚本),有没有办法让 git GUI 识别当前正在运行的 ssh 代理?因为解决这是我的问题的基础。 "有没有办法让 git GUI 识别当前正在运行的 ssh-agent?"我假设您是指运行 Git Bash 时在 .bashrc 中启动的 ssh-agent。那是对的吗?如果是这样,不,该 ssh-agent 是 Git Bash 的本地。您需要找到一种在外部环境中运行 ssh-agent 的方法,以便您在 Windows 中运行的所有应用程序都可以使用它。 啊!我不知道这一点。因此,是否有更简单的替代设置来让 git GUI 停止询问密码?我意识到这是一个新问题,但回答这个问题并更新它以为其他也遇到这个问题的人提供一个链接是有相关性的。 @Mr.Invisible 这就是我从一开始就试图解释的。我认为我评论中的措辞可能比我原来的答案更清楚。我不知道有什么解决方案。我主要在 Linux 中工作,偶尔只在 Windows 中编写代码。【参考方案2】:

查看我找到的指南 here,这导致我以不同的方式搜索内容。最终告诉我使用 Putty 及其 ssh 代理为我管理密码。

最终偶然发现了this 的帖子,他们在其中谈论如何让git 使用putty 的ssh 代理。这归结为我将GIT_SSH 放入指向plink.exe 的环境变量中,该变量位于putty 的安装文件夹中。

使用此方法时,它确实会出现一个错误,我不确定这只是我的机器/安装,或者这是否会影响所有人。通过在主机中打开 putty 和 ssh 以这种方式生成缓存,问题在这篇文章中解决了 here。因为已经有关于这方面的帖子,所以我将避免进一步解释为什么git 不能为我做这一步。

还请注意我上面的问题,我使用.bashrc 脚本在打开 git bash 时自动将密钥启动到 OpenSSH ssh-agent 中。由于这种腻子方法,这个脚本和所有相关文件都被删除了。这个已删除文件的简短列表是脚本创建的agent.env、保存脚本的.bashrc,以及创建的.pash_profile

完成后,git bash 和 git gui 都成功使用了 putty 代理,并且可以按照我喜欢的方式使用。我什至可以从上下文菜单中启动 git gui,让它识别 ssh 键,不再提示输入密码。

【讨论】:

很高兴您找到了解决方案。并感谢您写下来。希望这对将来的其他人有用。

以上是关于git push 在 bash 中使用 ssh-agent 但不是 gui的主要内容,如果未能解决你的问题,请参考以下文章

Git bash一闪而过,git不能push到远程仓库。

在 $git push -u origin main 命令之后,Git bash 没有请求任何身份验证,实际上啥都不做

在 $git push -u origin main 命令之后,Git bash 没有请求任何身份验证,实际上啥也没做

Git commit 用户与 git push 用户不同

Git push本地代码到新建远程仓库

一个 GIT 命令来统治它们(gacp:git-add-commit-push)