git 在 bash 中使用 ssh-agent 推送而不是 gui

git push using ssh-agent in bash but not gui

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

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

git@gitlab.com:repo

已使用提供的密码创建 SSH 密钥 (ED25519),并将 public 密钥添加到托管帐户。 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 以完成删除密码提示时,我是否遗漏了一个步骤?还是有其他事情发生?

非常感谢任何帮助,提前致谢

.bashrc 运行 开始时 Git Bash。这仅影响 bash 环境,但对整个 Windows 没有任何影响。当您 运行 GUI 时,.bashrc 中设置的 none 生效。我在我的 Windows 笔记本电脑上使用 IntelliJ 中的 Git 集成,但仍然没有弄清楚如何使用我的 SSH 密钥。我目前打开 Git Bash 来拉、推或与遥控器交互的任何其他东西。

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

最终偶然发现 this post,他们在其中讨论如何让 git 使用 putty 的 ssh 代理。这只是归结为我将 GIT_SSH 放入指向 plink.exe 的环境变量中,在 putty 的安装文件夹中找到。

使用此方法时,它确实会出现一个错误,我不确定这只是我的 machine/installation 还是这是否会影响所有人。通过在主机中打开 putty 和 ssh 以这种方式生成缓存,此 post 中的问题已解决 。因为已经有 posting 了,所以我将不再深入探讨为什么 git 不能为我做这一步。

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

完成后,git bash 和 git gui 都成功地使用了 putty 代理,并且可以随心所欲地使用。我什至可以从上下文菜单启动 git gui,让它识别 ssh 密钥,不再提示输入密码。

Git GUI 将在您的 C:\Users\<User>\.ssh 文件夹中查找 config 文件。如果添加 config 文件(无扩展名),则可以添加密钥的路径。否则 git GUI 将只查找默认键名。 由于某些原因 Git GUI 不执行 ~/.profile~/.bashrc(Git Bash 执行),这可用于自动启动 ssh 代理并添加密钥。

这种类型的配置文件对我有用:

IdentitiesOnly=yes
PreferredAuthentications publickey
PasswordAuthentication no
IdentityFile C:\Users\<user>\.ssh\id_ed25519_your_key
IdentityFile /c/Users/<user>/.ssh/id_ed25519_your_key
IdentityFile ~/.ssh/id_ed25519_your_key

三种路径符号中的任何一种都可以。有关配置文件的语法,请参阅 https://linux.die.net/man/5/ssh_config