如今有一个本身的 github 仓库 git@github.com:AAA/AAA.git
, 须要将这个仓库 clone
到本地修改代码并提交。git
git clone git@github.com:AAA/AAA.git
复制代码
再修改一些文件后提交代码github
git add .
git push
复制代码
会出现报错:ERROR: Permission to AAA.git
bash
这是由于 本地仓库没有权限推送到远端的 github
仓库。ssh
~/.ssh/id_rsa
文件。# 查看是否存在 .ssh 目录
ls ~ -a # 列出全部文件,看是否含有 .ssh
# 若是存在 .ssh 目录,查看是否存在 id_rsa、 id_rsa.pub 文件
ls ~/.ssh -a
复制代码
.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"
复制代码
github
。 settings -> SSH and GPG keys -> New SSH key
。~/.ssh/id_rsa.pub
里面的内容拷贝到 New SSH key
的Key
里面。# 进入 .ssh 目录
cd ~/.ssh/
cat id_rsa.pub
复制代码
将显示的内容拷贝到 New SSH key
的Key
里面。 并添加一个 title
, 点击 Add SSH key
测试
clone
的项目目录, 执行 git push
就能成功了。上面讲到的解决方案,目的是为了创建一个匹配本地和远端git的钥匙,这把钥匙是一串密码,本地使用这串要是只能开一把某一个 github 用户下的仓库。ui
git push
的时候又会遇到 一样的 权限问题: ERROR: Permission to XXX.git
或者 master -> master (Permission denied)
.这是由于在本地中已经配置了一个 ssh的 公钥(id_rsa.pub), 而这个公钥是 匹配的是 github 用户 A 的锁, 当咱们切换到 github 用户 B,的时候,这把公钥没有权限的。url
# 进入 .ssh 目录
cd ~/.ssh/
# 新建另一个 ssh key
ssh-keygen -t rsa -C "your_BBB_email@example.com"
复制代码
这里不要一路回车, 这里不要一路回车, 这里不要一路回车 会有一个提醒 去填写一个 key 的保存路径, 填写一个新的 id_rsa 的路径. 好比: id_rsa_userBBB ,图中我使用了 id_rsa_BBB 其余的一路回车就能够了。spa
查看新的 id_rsa_BBB, 并复制. 3d
打开BBB账号的 github
。 settings -> SSH and GPG keys -> New SSH key
。代理
将本地刚刚生成的 ~/.ssh/id_rsa_BBB.pub
里面的内容拷贝到 New SSH key
的Key
里面。
这时候虽然已经新建一把公钥链接了新的github 用户和本地,可是问题尚未解决,ssh 并不能区分两把钥匙,默认状况下他只使用 A 的钥匙,能够在BBB帐户仓库的根目录作一下测试:
ssh -T git@github.com
复制代码
权限钥匙
git push
的时候,让 git 知道该使用那一把钥匙~/.ssh/config
文件 若是没有就新建一个。# default github setting
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa
# another user rsa pub
Host github-BBB
HostName github.com
User git
# ~/.ssh/id_rsa_BBB 文件为刚生成的 rsa 文件
IdentityFile ~/.ssh/id_rsa_BBB
复制代码
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 钥匙和对应仓库锁的关系
这是由于系统默认的RSA 文件名是 id_rsa
, 可是咱们如今建立了另一个 RSA 文件 id_rsa_BBB
, 这个文件匹配到的 HostName
地址 (config
文件中设置的) 的 IP 并不存在于 RSA host 列表中,须要将这个 IP 的 host 永久地加入到 RSA host 列表中。
.ssh 目录
新建一个 SSH 的代理,用来存放 RSA host 列表eval "$(ssh-agent -s)"
复制代码
ssh-add id_rsa_BBB
复制代码
总结: 本地仓库推送到远端仓库使用 ssh 链接, 这就须要使用到 ssh 的 id_rsa 做为打开远端仓库的钥匙。
- 当单个本地钥匙链接远端时,只用配置一个 id_rsa, 而后在 github 仓库中新增一个ssh key, 将 id_rsa.pub 的内容设置为这个 key 就能实现链接了。
- 当须要链接多个 github 仓库时, 就须要在本地新建对应多的id_rsa, 并使用不一样的文件进行区分, 而后使用 config 文件 来配置不一样 id_rsa 对应的
host / hostName / IdentityFile
,来实现钥匙的区分。 再把不一样的仓库名称使用 host 来从新设置远端仓库的地址。 最后对应的 id_rsa 的公钥添加到 github 的 SSH key