問題提出
最近在自己的MAC上面提交Github
代碼的時(shí)候發(fā)現(xiàn)居然失敗了:
$ 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
都提交過無數(shù)次了之宿,咋就失敗了呢腐巢?莫非Github
上的ssh key被刪掉了么左冬。于是打開github ssh斤彼,嘗試再次把ssh key加上,卻提示key已經(jīng)存在了展鸡。于是趕緊回到本地repo查看下用戶是不是對(duì)的:
$ 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
發(fā)現(xiàn)郵件居然是nbaoping@xxx.com
(此處已打碼)屿衅,顯然跟本地repo的keysaim@gmail.com
不同,git
提交的時(shí)候沒有特殊配置莹弊,會(huì)使用默認(rèn)的ssh key涤久,也就是~/.ssh/id_rsa.pub
涡尘,而提交的用戶信息跟此key并不能對(duì)應(yīng)上,故此github
拒絕了此次提交响迂。既然如此考抄,那把本地repo的用戶信息改成key所對(duì)應(yīng)的信息不就好了嗎?是的蔗彤,但是此信息都已經(jīng)打碼了就充分說明本博主是十分不愿暴露它的川梅,咱必須得想其它轍。
好了然遏,現(xiàn)在的問題就是贫途,如何使用特定的ssh key提交Git?本文就來講述一種通用的解決辦法待侵。
指定git
提交使用的ssh key
-
查看repo對(duì)應(yīng)的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
最關(guān)鍵的是郵件信息
keysaim@gmail.com
。如果沒有用戶信息秧倾,可以先配置:$ git config user.email "keysaim@gmail.com" $ git config user.name "keysaim"
注意怨酝,很多教程里面以及
git
的錯(cuò)誤提示里面會(huì)建議在git config
后面加入?yún)?shù)git config --global
,這里那先,千萬不要加入此參數(shù)农猬,否則它會(huì)去嘗試修改你的git
的全局配置,也就是你所有repo默認(rèn)的用戶信息售淡。你可以在文件~/.git/config
查看你的全局配置斤葱,其中[user]
段就是你的默認(rèn)用戶信息。咱們這里就是為了能夠給這個(gè)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
。該命令是一個(gè)交互式的命令惯驼,其中大部分你都可以直接回車蹲嚣,但是對(duì)于第一個(gè)提示Enter file in which to save the key
,請務(wù)必輸入你想要的文件名祟牲,否則它將覆蓋你默認(rèn)的ssh key隙畜,這個(gè)可是不可逆的。這里使用文件名id_rsa.github
说贝。如果沒有指定文件夾在路徑中议惰,該命令會(huì)在當(dāng)前目錄下生成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
對(duì)應(yīng)的具體域名运杭,這里跟Host
保持一致夫啊。(Host
跟Hostname
可以不一致,但是Host
必須跟repo的hostname保持一致辆憔,也就是git到時(shí)候會(huì)用自己repo的hostname來ssh配置文件里面找是不是有對(duì)應(yīng)的Host
撇眯,找到了就使用該配置,具體訪問的域名會(huì)采用HostName
) -
User git
說明該配置的用戶得是git
-
IdentityFile /Users/nbaoping/.ssh/id_rsa.github
這行最為關(guān)鍵虱咧,指定了該使用哪個(gè)ssh key文件熊榛,這里的key文件一定指的是私鑰文件。之前我們生成了新的私鑰文件
~/.ssh/id_rsa.github
腕巡,由于博主使用的是MAC来候,~
被翻譯成/Users/nbaoping/
了,如果是在一般的Linux環(huán)境下逸雹,改路徑前綴該是/home/nbaoping/
营搅。 -
IdentitiesOnly yes
請配置為
yes
,具體意義可以參考討論梆砸。
-
-
將生成的ssh key加入
github
打開github ssh key配置頁面转质,點(diǎn)擊
New SSH Key
,給剛剛生成的key取名帖世,如keysaim-mac
休蟹。把~/.ssh/id_rsa.github.pub
(請務(wù)必注意是公鑰文件,千萬不要搞錯(cuò)了)里面的內(nèi)容拷貝過來日矫,點(diǎn)擊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
可以看到哪轿,這次提交成功了盈魁。
結(jié)語
當(dāng)你需要把某些repo以不同的用戶提交的時(shí)候,可以按照本文給他們配置特殊的ssh key窃诉,但是注意的一點(diǎn)就是杨耙,這種配置事基于Host
,也就是repo的hostname飘痛,如果需要確保不同的repo使用不同的ssh key珊膜,需要每個(gè)repo使用不同的hostname。
本文也可以在博主個(gè)人博客中查看宣脉。