// Linux · 2025-12-05

【Git 实战排障】配置了 GitHub SSH 密钥,为啥推送时还要登录?

大家好,今天来解决一个很多同学在Git+GitHub使用中会踩的坑:明明已经在GitHub账号里配置好了SSH密钥,结果推送代码时还是弹出“输入用户名密码”的登录提示——这问题我自己刚开始用Git的时候也遇到过,今天就把原理和解决方法讲透。

一、问题根源:你用的是HTTPS协议,不是SSH协议

核心矛盾:SSH密钥只对SSH协议的远程仓库地址生效,但你的本地仓库,现在绑定的是HTTPS协议的远程地址。

比如我执行git push -u origin main时,终端里弹出的是https://github.com开头的地址提示——这说明当前仓库用的是HTTPS协议,Git会默认用“账号+密码”的方式验证身份,完全不会调用你配置的SSH密钥。

先搞懂:HTTPS和SSH协议的区别

这两个是Git连接远程仓库的两种方式,认证逻辑完全不一样:

协议类型 地址格式示例 认证方式 是否依赖SSH密钥
HTTPS https://github.com/你的用户名/仓库名.git 账号+密码(或PAT令牌) 不依赖
SSH git@github.com:你的用户名/仓库名.git SSH密钥对 必须依赖

二、先验证:你的远程地址是不是HTTPS?

在本地仓库的终端里,先执行这条命令,看看当前远程地址的格式:

git remote -v

如果输出是下面这样(包含https://github.com/),那问题就实锤了——确实是HTTPS协议:

origin  https://github.com/Yanxinwu946/pentest.git (fetch)
origin  https://github.com/Yanxinwu946/pentest.git (push)

三、解决步骤:把远程地址切换为SSH格式

只需要把当前仓库的远程地址改成SSH协议,Git就会自动用SSH密钥认证,不用再输账号密码了。

步骤1:获取仓库的SSH地址

打开你的GitHub仓库页面,点绿色的“Code”按钮,选“SSH”选项,复制对应的地址(格式是git@github.com:你的用户名/仓库名.git): GitHub复制SSH地址

步骤2:修改本地仓库的远程地址

在本地仓库的终端里,执行这条命令(把地址替换成你刚复制的SSH地址):

git remote set-url origin git@github.com:你的用户名/仓库名.git

步骤3:确认修改成功

再执行git remote -v,如果地址变成了git@github.com开头,说明改对了:

origin  git@github.com:你的用户名/仓库名.git (fetch)
origin  git@github.com:你的用户名/仓库名.git (push)

步骤4:测试推送(不用登录了!)

执行推送命令,这时候Git会自动用SSH密钥认证:

git push -u origin main

如果弹出类似Hi 你的用户名! You've successfully authenticated...的提示,说明SSH密钥生效了——这次推送完,后面就不会再要求登录了。

四、额外检查:确保SSH密钥全局能用

SSH密钥是用户级的全局配置(你电脑上所有Git仓库都能用),但得确认密钥配置没问题:

1. 检查本地有没有SSH密钥

执行这条命令,看看~/.ssh/目录下有没有密钥对:

ls ~/.ssh/

如果能看到id_rsa(私钥)和id_rsa.pub(公钥),说明密钥已经生成好了。

2. 测试SSH能不能连GitHub

执行这条命令,验证密钥是否能正常连接GitHub:

ssh -T git@github.com

如果输出Hi 你的用户名! You've successfully authenticated...,说明SSH密钥配置正确,所有仓库都能用这个密钥。

五、避坑技巧:以后别再踩同样的坑

1. 克隆仓库时直接用SSH地址

后面克隆GitHub仓库,直接选SSH地址克隆,就不用再改地址了:

git clone git@github.com:你的用户名/仓库名.git

2. 批量改已有仓库的地址(可选)

如果本地有很多仓库都是HTTPS地址,可以用脚本批量切换成SSH(以Linux/Mac为例):

# 假设你的仓库都存在~/git-repos目录下
find ~/git-repos -type d -name ".git" | while read gitdir; do
  repo_dir=$(dirname "$gitdir")
  cd "$repo_dir"
  # 把HTTPS地址换成SSH格式
  git remote set-url origin $(git remote get-url origin | sed 's/https:\/\/github.com\//git@github.com:/')
  echo "已把仓库 $repo_dir 的地址改成SSH"
done

六、总结

一句话说清楚:配置了SSH密钥却还要登录,是因为远程仓库用的是HTTPS协议。只要把远程地址换成SSH格式,Git就会自动用密钥认证,彻底解决重复登录的问题。

原文 https://blog.csdn.net/2301_79518550/article/details/155619548