如今有一個本身的 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
複製代碼
能夠看到在BBB賬號下的倉庫,使用的仍是AAA 用戶的
權限鑰匙
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)"
複製代碼
2. 添加新建的密鑰文件到代理中:
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