博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在本地设置一个或者多个id_rsa 来连接 github 仓库并实现 git push / git pull
阅读量:4085 次
发布时间:2019-05-25

本文共 3198 字,大约阅读时间需要 10 分钟。

场景一: 本地只需要一个 ssh id_rsa 来连接 GitHub仓库

现在有一个自己的 github 仓库 git@github.com:AAA/AAA.git, 需要将这个仓库 clone 到本地修改代码并提交。

git clone git@github.com:AAA/AAA.git复制代码

再修改一些文件后提交代码

git add .git push 复制代码

会出现报错:ERROR: Permission to AAA.git

permission error

 

 

这是因为 本地仓库没有权限推送到远端的 github 仓库。

解决方法

  1. 查看本地是否存在 ~/.ssh/id_rsa 文件。
# 查看是否存在 .ssh 目录ls ~ -a  # 列出所有文件,看是否含有 .ssh# 如果存在 .ssh 目录,查看是否存在 id_rsa、 id_rsa.pub 文件ls ~/.ssh -a复制代码
  1. 如果没有 .ssh 目录 或者 没有 id_rsa id_rsa.pub
mkdir .ssh # 如果没有 .ssh 目录cd .ssh# 如果没有 id_rsa、 id_rsa.pub 文件,运行下面的命令, 并一路回车ssh-keygen -t rsa -C "your_email@example.com" 复制代码
  1. 打开 自己的 githubsettings -> SSH and GPG keys -> New SSH key
  2. 将本地刚刚生成的 ~/.ssh/id_rsa.pub 里面的内容拷贝到 New SSH keyKey里面。
# 进入 .ssh 目录cd ~/.ssh/cat id_rsa.pub复制代码

 

 

 

将显示的内容拷贝到 New SSH keyKey里面。 并添加一个 title, 点击 Add SSH key

  1. 再次进入到刚开始 clone 的项目目录, 执行 git push 就能成功了。

上面讲到的解决方案,目的是为了建立一个匹配本地和远端git的钥匙,这把钥匙是一串密码,本地使用这串要是只能开一把某一个 github 用户下的仓库。

情景二: 如果我们有两个 github 的用户 A 和 B, 当切换到另外一个用户 B,并在本地 clone 了这个用户下的一个仓库, 这时当 git push 的时候又会遇到 同样的 权限问题: ERROR: Permission to XXX.git 或者 master -> master (Permission denied).

这是因为在本地中已经配置了一个 ssh的 公钥(id_rsa.pub), 而这个公钥是 匹配的是 github 用户 A 的锁, 当我们切换到 github 用户 B,的时候,这把公钥没有权限的。

解决方案

  1. 生成一个新的 SSH KEY (id_rsa id_rsa.pub)
# 进入 .ssh 目录cd ~/.ssh/# 新建另外一个 ssh keyssh-keygen -t rsa -C "your_BBB_email@example.com"复制代码

这里不要一路回车, 这里不要一路回车, 这里不要一路回车 会有一个提醒 去填写一个 key 的保存路径, 填写一个新的 id_rsa 的路径. 比如: id_rsa_userBBB ,图中我使用了 id_rsa_BBB 其他的一路回车就可以了。

 

 

 

  1. 查看新的 id_rsa_BBB, 并复制.

     

  2. 打开BBB帐号的 githubsettings -> SSH and GPG keys -> New SSH key

  3. 将本地刚刚生成的 ~/.ssh/id_rsa_BBB.pub 里面的内容拷贝到 New SSH keyKey里面。

这时候虽然已经新建一把公钥连接了新的github 用户和本地,但是问题还没有解决,ssh 并不能区分两把钥匙,默认情况下他只使用 A 的钥匙,可以在BBB账户仓库的根目录做一下测试:

ssh -T git@github.com复制代码

 

 

可以看到在BBB帐号下的仓库,使用的还是AAA 用户的 权限钥匙

 

下面需要将本地的两把钥匙做一下区分,以便在使用 git push 的时候,让 git 知道该使用那一把钥匙

  1. 打开 ~/.ssh/config 文件 如果没有就新建一个。
  2. 编辑 config 内容:
# default github setting Host github.comHostName github.comUser gitIdentityFile ~/.ssh/id_rsa# another user rsa pub Host github-BBBHostName github.comUser git# ~/.ssh/id_rsa_BBB 文件为刚生成的 rsa 文件IdentityFile ~/.ssh/id_rsa_BBB复制代码
  1. 在BBB帐号仓库下替换 git 仓库的地址。
git remote -v # 查看仓库地址复制代码

 

 

我们需要将仓库的地址中的 github.com/替换成 github-BBB:(github-BBB 字段是在 config 文件中添加的 Host 字段 )

 

git remote set-url origin github-BBB:BBB用户/XXX仓库.git复制代码

这样每次 git pull / git push 的时候, 都会经过 Host 的匹配,来把钥匙指向 ~/.ssh/id_rsa_BBB 文件,这样本地就能分清楚哪一个仓库具体应该使用那一把钥匙喽。

多个 公钥匹配不同的仓库都可以使用这种方式解决。 使用命令: ssh -T git@Host 可以查看Host 钥匙和对应仓库锁的关系

Warning: Permanently added the RSA host key for IP address 'xxx.xx.xxx.xxx' to the list of known hosts.

 

 

 

这是因为系统默认的RSA 文件名是 id_rsa, 但是我们现在创建了另外一个 RSA 文件 id_rsa_BBB, 这个文件匹配到的 HostName地址 (config文件中设置的) 的 IP 并不存在于 RSA host 列表中,需要将这个 IP 的 host 永久地加入到 RSA host 列表中。

  1. 进入到 .ssh 目录 新建一个 SSH 的代理,用来存放 RSA host 列表
eval "$(ssh-agent -s)"复制代码

 

 

2. 添加新建的密钥文件到代理中:

 

ssh-add id_rsa_BBB复制代码

 

 

 

总结: 本地仓库推送到远端仓库使用 ssh 连接, 这就需要使用到 ssh 的 id_rsa 作为打开远端仓库的钥匙。

  1. 当单个本地钥匙连接远端时,只用配置一个 id_rsa, 然后在 github 仓库中新增一个ssh key, 将 id_rsa.pub 的内容设置为这个 key 就能实现连接了。
  2. 当需要连接多个 github 仓库时, 就需要在本地新建对应多的id_rsa, 并使用不同的文件进行区分, 然后使用 config 文件 来配置不同 id_rsa 对应的 host / hostName / IdentityFile,来实现钥匙的区分。 再把不同的仓库名称使用 host 来重新设置远端仓库的地址。 最后对应的 id_rsa 的公钥添加到 github 的 SSH key

作者:闲不住的李先森
链接:https://juejin.im/post/5e66f99651882549274a65c5
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的文章
开发自己的react-native组件并发布到npm
查看>>
rem布局解析
查看>>
webpack4介绍与总结
查看>>
Vue异步组件处理路由组件加载状态
查看>>
webapck4 多页面,多环境配置
查看>>
关于 React Router4,你所需要知道的一切
查看>>
前端面试总结
查看>>
JS的节流、函数防抖 原理及使用场景
查看>>
vue2.0做移动端开发用到的相关插件和经验总结
查看>>
网易云音乐接口+vue全家桶开发一款移动端音乐webApp
查看>>
React router动态加载组件-适配器模式的应用
查看>>
Vue中使用px2rem
查看>>
React非嵌套组件通信
查看>>
Websocket 使用指南
查看>>
前端常用插件、工具类库汇总,不要重复造轮子啦!!!
查看>>
基于Vue全家桶制作的的高仿美团APP
查看>>
浏览器兼容性问题解决方案 · 总结
查看>>
一个很棒的Flutter学习资源列表
查看>>
为什么你应该放弃React老的Context API用新的Context API
查看>>
vuex持久化方案探究
查看>>