问题提出

最近在自己的MAC上面提交Github代码的时候发现居然失败了:

$ git push origin master
Permission denied (publickey).
fatal: Could not read from remote repository. Please make sure you have the correct access rights
and the repository exists.

这不是坑爹吗,Github都提交过无数次了,咋就失败了呢?莫非Github上的ssh key被删掉了么。于是打开github ssh,尝试再次把ssh key加上,却提示key已经存在了。于是赶紧回到本地repo查看下用户是不是对的:

$ git config -l
...
user.email=keysaim@gmail.com
user.name=keysaim

再查看下本地的ssh key:

$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCu4Jy/+uFGiC89luBejzCEyPbY0SRoppyzrB4g1v3zv1OleylMzdf+eTTRcYgMbYoY6ZQs4M2NHX20iO6vf6j2uPvUsB++pP0G6Q7+VlrUlC19B07IVx7Mo2xmHCe4bMshFSugqOl+hV6zVjGpYJcLI9XtWQ6F/br4tkYD/J8KWns+SNha8gJVBckV1ncGlR+Q7ji4OM4+eIhKEEK4Wo7Cf7KaT71fIVFl7XRx5kmdtEN3F+wT4LjNb2okl8Pu4mmxCMwJvXzj0Jr9PkVzhSAhDkWG3mMt3kC5PhhRhCP7uwkGFsOEm5uGS907wTxY9cJNIl8FikOfmvDa5XrfMbMx nbaoping@xxx.com

发现邮件居然是nbaoping@xxx.com(此处已打码),显然跟本地repo的keysaim@gmail.com不同,git提交的时候没有特殊配置,会使用默认的ssh key,也就是~/.ssh/id_rsa.pub,而提交的用户信息跟此key并不能对应上,故此github拒绝了此次提交。既然如此,那把本地repo的用户信息改成key所对应的信息不就好了吗?是的,但是此信息都已经打码了就充分说明本博主是十分不愿暴露它的,咱必须得想其它辙。

好了,现在的问题就是,如何使用特定的ssh key提交Git?本文就来讲述一种通用的解决办法。

指定git提交使用的ssh key

  • 查看repo对应的hostname

    $ git remote -v
    origin git@github.com:keysaim/keysaim.github.io.git (fetch)
    origin git@github.com:keysaim/keysaim.github.io.git (push)

    其中github.com就是repo使用的hostname

  • 查看repo的用户信息

    $ git config -l
    ...
    user.email=keysaim@gmail.com
    user.name=keysaim

    最关键的是邮件信息keysaim@gmail.com。如果没有用户信息,可以先配置:

    $ git config user.email "keysaim@gmail.com"
    $ git config user.name "keysaim"

    注意,很多教程里面以及git的错误提示里面会建议在git config后面加入参数git config --global,这里,千万不要加入此参数,否则它会去尝试修改你的git的全局配置,也就是你所有repo默认的用户信息。你可以在文件~/.git/config查看你的全局配置,其中[user]段就是你的默认用户信息。咱们这里就是为了能够给这个repo指定特定的ssh key,显然不适合使用全局的配置。

  • 为repo的用户生成新的ssh key

    $ ssh-keygen -C "keysaim@gmail.com"
    Generating public/private rsa key pair.
    Enter file in which to save the key (/Users/nbaoping/.ssh/id_rsa): id_rsa.github
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in id_rsa.github.
    Your public key has been saved in id_rsa.github.pub.
    The key fingerprint is:
    SHA256:G0djI0bh+XwGcwOZ0AsbQ8ffB51pYrfSlRALNZw3igc keysaim@gmail.com
    The key's randomart image is:
    +---[RSA 2048]----+
    | .==o+o=+.+|
    | o+o=E.=+Oo|
    | ==Bo*oB.+|
    | ..*.B.=.o.|
    | S + + .. |
    | + o |
    | . |
    | |
    | |
    +----[SHA256]-----+

    其中,-C是用来指定该key的用户信息的,这里咱们使用了keysaim@gmail.com。该命令是一个交互式的命令,其中大部分你都可以直接回车,但是对于第一个提示Enter file in which to save the key请务必输入你想要的文件名,否则它将覆盖你默认的ssh key,这个可是不可逆的。这里使用文件名id_rsa.github。如果没有指定文件夹在路径中,该命令会在当前目录下生成key文件:

    $ ls id_rsa.github*
    id_rsa.github id_rsa.github.pub

    其中id_rsa.github是私钥,而id_rsa.github.pub为公钥。将key文件移到ssh目录下~/.ssh/

    $ mv id_rsa.github* ~/.ssh/
  • 配置ssh以使用新的key

    修改ssh的配置文件~/.ssh/config,加入如下配置:

    Host github.com
    HostName github.com
    User git
    IdentityFile /Users/nbaoping/.ssh/id_rsa.github
    IdentitiesOnly yes

    下面逐行解释:

    • Host github.com

      用来指定该key的Host名字,此处必须使用本地repo的hostname github.com

    • Hostname github.com

      此处指定Host对应的具体域名,这里跟Host保持一致。(HostHostname可以不一致,但是Host必须跟repo的hostname保持一致,也就是git到时候会用自己repo的hostname来ssh配置文件里面找是不是有对应的Host,找到了就使用该配置,具体访问的域名会采用HostName

    • User git

      说明该配置的用户得是git

    • IdentityFile /Users/nbaoping/.ssh/id_rsa.github

      这行最为关键,指定了该使用哪个ssh key文件,这里的key文件一定指的是私钥文件。之前我们生成了新的私钥文件~/.ssh/id_rsa.github,由于博主使用的是MAC,~被翻译成/Users/nbaoping/了,如果是在一般的Linux环境下,改路径前缀该是/home/nbaoping/

    • IdentitiesOnly yes

      请配置为yes,具体意义可以参考讨论

  • 将生成的ssh key加入github

    打开github ssh key配置页面,点击New SSH Key,给刚刚生成的key取名,如keysaim-mac。把~/.ssh/id_rsa.github.pub(请务必注意是公钥文件,千万不要搞错了)里面的内容拷贝过来,点击Add SSH Key按钮保持。

  • 提交

    做完上面的步骤之后,就可以提交了:

    $ git push origin master
    Counting objects: 63, done.
    Delta compression using up to 8 threads.
    Compressing objects: 100% (62/62), done.
    Writing objects: 100% (63/63), 838.96 KiB | 0 bytes/s, done.
    Total 63 (delta 2), reused 0 (delta 0)
    remote: Resolving deltas: 100% (2/2), done.
    To github.com:keysaim/keysaim.github.io.git
    73a2043..88cacc1 master -> master

    可以看到,这次提交成功了。

结语

当你需要把某些repo以不同的用户提交的时候,可以按照本文给他们配置特殊的ssh key,但是注意的一点就是,这种配置事基于Host,也就是repo的hostname,如果需要确保不同的repo使用不同的ssh key,需要每个repo使用不同的hostname。

本文也可以在博主个人博客中查看

如何使用特定的SSH Key提交GIT的更多相关文章

  1. git生成公钥public key并添加SSH key。git乌龟gerrit下推送git【server sent :publickey】

    一.key 码云链接:http://git.mydoc.io/?t=180845#text_180845 博客链接: 方式一:https://blog.csdn.net/xb12369/article ...

  2. TortoiseGit的ssh key和Git的ssh key

    情景模拟: 你使用Git+TortoiseGit对项目进行版本控制,本地库(自己电脑建立的.git)与远程库(如GitLab上建立)通信需要使用ssh验证,你用git生成公钥并保存到了Gitlab上, ...

  3. git配置多个ssh key

    随着工作的深入,我们通常都会有多个git账户.比如公司gitlab一个账户,github或gitee有一个账户.而平时我们又回通过 配置ssh公私钥认证的方式省去繁琐的登录远程仓库的操作,不同的git ...

  4. 设置 SSH Key 登录服务器和 Git 服务器

    设置 SSH Key 登录服务器 通过 ssh 登录服务器,一直都是用的账号和密码,今天看到一篇文章说这样不安全,使用 ssh key 的方式登录则是更好的选择,因此,研究实践了一下,并记录在这里. ...

  5. Git生成本机SSH Key并添加到GitHub中

    1.检查电脑里是否有SSH Key 打开git Bash客户端 cd ~/.ssh ls 如果有就会输出下面内容 config id_rsa id_rsa.pub known_hosts 2.创建 邮 ...

  6. 「BUAA OO Pre」Git生成多个ssh key并连接GitLab仓库

    「BUAA OO Pre」Git生成多个ssh key并连接GitLab仓库 Part 0 前言 写作背景 笔者在配置学校GitLab的ssh key时遇到一些问题,原因应为曾经配置过GitHub的s ...

  7. github 添加 SSH key

    在 github 上添加 SSH key 的步骤: 1.首先需要检查你电脑是否已经有 SSH key 运行 git Bash 客户端,输入如下代码: $ cd ~/.ssh $ ls 这两个命令就是检 ...

  8. github入门:设置添加ssh key<转>

    GitHub是个分布式的版本控制库.github通过git使用,可以方便的记录代码版本. 通过github可以学习优秀的代码,可以改进提交其他项目中的bug,借助社区力量促进软件优化完善. 国内外大量 ...

  9. SSH连接GitHub并配置ssh key

    SSH连接GitHub并配置ssh key 配置git的ssh提交,主要需要以下三步: 1.设置Git的user name和email 2.生成ssh 3.配置git 的ssh key 一.设置Git ...

  10. 多个github帐号的SSH key切换

    写在前面的话 github账号,工作有一个,自己有一个.但是默认下使用ssh key在git push时只有默认账号能免输入账号和密码. 如果想让另一个账号在代码push时免账号和密码,请看这篇文章h ...

随机推荐

  1. 墨天轮高分技术文档分享——Oracle升级迁移篇(共96个)

    朋友们好久不见,在上期<墨天轮最受欢迎的技术文档-SQL优化篇>的留言中,有许多朋友表示想看数据库升级迁移相关的内容,经过搜集整理,这就为大家呈上!原文送墨值中,欢迎大家参与~ 数据库升级 ...

  2. v-if 为什么不能和 v-for 一起使用 ?

    当 Vue 处理指令时,v-for 比 v-if 具有更高的优先级,通过v-if 移动到容器元素,不会再重复遍历列表中的每个值.取而代之的是,我们只检查它一次,且不会在 v-if 为否的时候运算 v- ...

  3. 你所理解的 mvvm 模型

    mvvm 是Model-View-ViewModel 数据驱动视图模型,是mvc 的改进版 ,mvvm把界面ui和业务逻辑分离 ,model 是data属性的数据 , view 是模板结构 ,view ...

  4. 04 统计语言模型(n元语言模型)

    博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...

  5. Minecraft小说

    小说标题:<方块与冒险:勇者的传说> 持续更新中 故事简介: 主角艾伦(Alan)是一个普通的玩家,偶然之间被传送到Minecraft的世界中.这个世界充满了各种各样的奇迹.冒险.危险和谜 ...

  6. 24个希腊字母与 Tex 表示

    大写 小写 英文 中文 Α α Alpha 阿尔法 Β β Beta 贝塔 Γ γ Gamma 伽马 Δ δ Delta 德尔塔 Ε ε Epsilon 艾普西隆 Ζ ζ Zeta 泽塔 Η η Et ...

  7. AI五子棋_06 坐标表示到图形表示的算法 Python实现

    AI五子棋 第六步 恭喜你到达第六步! 你已经成功实现了公钥体系最为关键的部分.现在服务器相信你就是你了,下面开始你的战斗. 五子棋的棋盘有15×15个交点,一共有225个交点,我们可以在每一个交点上 ...

  8. JS 本地存储 localStorage 操作总结

    现在前端做数据存储,跨页面传值,localStorage是一个很好的方式,以键值对的方式存储,也方便取值赋值,下面说一说使用方法和一些常见的使用技巧. 1.存值共有3种方式,localStorage相 ...

  9. vue3 js 学习笔记

    Vue3-js 学习笔记 目录 Vue3-js 学习笔记 目录 前言 reactive 数据绑定 事件绑定 生命函数周期 计算属性-computed props emit-自定义事件 ref-获取元素 ...

  10. Windows11 常用软件/环境安装记录

    Windows 编程 - The Tools I use 软件安装和管理 将软件装到统一一个地方,路径简短,不含空格和中文. WinGet 官方 Windows 软件包管理器 WinGet 在安装命令 ...