背景描述
眾所周知,在GitHub中就珠,每個倉庫都有兩個地址蛉威,分別基于HTTPS
協議和SSH
協議仿荆,兩個協議對應的URL地址(repository_url)形式如下所示:
# HTTPS
https://github.com/DJIXY/MobileStore.git
# SSH
git@github.com:DJIXY/MobileStore.git
正常情況下臊泌,只要在本地正確地配置好了git
賬號鲤桥,采用這兩個地址中的任意一個,都可以通過git clone repository_url
獲取代碼渠概。
但最近我在Macbook Air中clone
公司托管在GitHub私有庫中的代碼時茶凳,發(fā)現無法通過HTTPS
協議的地址clone
代碼,始終提示remote: Repository not found.
的錯誤播揪。
? git clone https://github.com/DJIXY/MobileStore.git
Cloning into 'MobileStore'...
remote: Repository not found.
fatal: repository 'https://github.com/DJIXY/MobileStore.git/' not found
首先贮喧,這個代碼倉庫是確實存在的,而且地址肯定也是沒有問題的剪芍,通過URL地址也能在瀏覽器中訪問到對應的GitHub倉庫頁面塞淹。
其次,在本地對git
的配置也是沒有問題的罪裹,通過SSH
協議的地址是可以正常clone
代碼的饱普。
? git clone git@github.com:DJIXY/MobileStore.git
Cloning into 'MobileStore'...
Warning: Permanently added the RSA host key for IP address '192.30.252.131' to the list of known hosts.
remote: Counting objects: 355, done.
remote: Compressing objects: 100% (3/3), done.
并且,如果在HTTPS
協議的URL地址中加上GitHub賬號状共,也是可以正常clone
代碼的套耕。
? git clone https://djileolee@github.com/DJIXY/MobileStore.git
Cloning into 'MobileStore'...
remote: Counting objects: 355, done.
remote: Compressing objects: 100% (3/3), done.
更奇怪的是,在我的另一臺Mac Mini中峡继,采用同樣的賬號配置冯袍,兩種協議的URL地址卻都能正常clone
代碼,仔細地對比了兩臺電腦的git
配置碾牌,都是一樣的康愤。
? cat ~/.git-credentials
https://djileolee:340d247cxxxxxxxxf39556e38fe2b0baxxxxxxxx@github.com
?
? cat ~/.gitconfig
[credential]
helper = store
那問題出在哪兒呢?
定位分析
通過Google得知舶吗,產生remote: Repository not found.
報錯的原因主要有兩個征冷,一是倉庫地址錯誤,二是權限校驗不通過誓琼。顯然检激,第一個原因可以直接排除,在Macbook Air中出現該問題應該就是賬號權限校驗失敗造成的腹侣。
對背景描述中的現象進行整理叔收,重點關注兩個疑點:
- 通過
HTTPS
協議的URL地址進行git clone
時,系統(tǒng)沒有提示讓輸入用戶名密碼傲隶,就直接返回權限校驗失敗的異常饺律; - 在
HTTPS
協議的URL地址中加上GitHub用戶名,就可以正常clone
伦籍,而且蓝晒,系統(tǒng)也沒有提示輸入密碼腮出。
這說明,在系統(tǒng)中的某個地方芝薇,應該是保存了GitHub賬號密碼的胚嘲,所以在未指定賬號的情況下,git clone
時系統(tǒng)就不再要求用戶輸入賬號密碼洛二,而是直接讀取那個保存好的賬號信息馋劈;但是,那個保存的GitHub賬號密碼應該是存在問題的晾嘶,這就造成采用那個賬號信息去GitHub校驗時無法通過妓雾,從而返回異常報錯。
基于以上推測垒迂,尋找問題根源的當務之急是找到保存GitHub賬號密碼的地方械姻。
通過查看Git官方文檔,存儲Git用戶信息的地方有三個:
-
/etc/gitconfig
:存儲當前系統(tǒng)所有用戶的git配置信息机断; -
~/.gitconfig
或~/.config/git/config
:存儲當前用戶的git配置信息楷拳; - 倉庫的Git目錄中的config文件(即
repo/.git/config
):存儲當前倉庫的git配置信息。
這三個配置項的優(yōu)先級從上往下依次上升吏奸,即repo/.git/config
會覆蓋~/.gitconfig
中的配置欢揖,~/.gitconfig
會覆蓋/etc/gitconfig
中的配置。
回到當前問題奋蔚,由于還沒有進入到具體的Git倉庫她混,因此repo/.git/config
可直接排除;然后是查看當前用戶的git配置泊碑,在當前用戶HOME目錄下沒有~/.config/git/config
文件坤按,只有~/.gitconfig
,不過在~/.gitconfig
中并沒有賬號信息馒过;再去查看系統(tǒng)級的git配置信息晋涣,即/etc/gitconfig
文件,但發(fā)現當前系統(tǒng)中并沒有該文件沉桌。
找遍了Git用戶信息可能存儲的地方,都沒有看到賬號配置信息算吩,那還可能存儲在哪兒呢留凭?
這時基本上是毫無思路了,只能靠各種胡亂猜測偎巢,甚至嘗試采用Wireshark分別在兩臺Mac上對git clone
的過程進行抓包蔼夜,對比通訊數據的差異,但都沒有找到答案压昼。
最后求冷,無意中想到了Mac的Keychain
機制瘤运。在Mac OSX的Keychain
中,可以保存用戶的賬號密碼等credentials
匠题,那git賬號會不會也保存到Keychain
中了呢拯坟?
在Macbook Air中打開Keychain Access
應用軟件,搜索github
韭山,果然發(fā)現存在記錄郁季。
而且,github.com
這一項還存在兩條記錄钱磅。一條是我的個人賬號debugtalk
梦裂,另一條是公司的工作賬號djileolee
。
至此盖淡,真相大白D昴!褪迟!
在我的Macbook Air中冗恨,Keychain Access
中保存了我的GitHub個人賬號(debugtalk
),該賬號是沒有權限訪問公司私有倉庫的牵咙。但是在Terminal中執(zhí)行git clone
命令時派近,系統(tǒng)優(yōu)先讀取了我的個人賬號,并用該賬號向GitHub發(fā)起校驗請求洁桌,從而造成讀取公司私有倉庫時權限校驗失敗渴丸。然而,在HTTPS
協議的URL地址中加上GitHub工作賬號(djileolee
)時另凌,由于此時指定了賬號名稱谱轨,因此在Keychain
中讀取賬號信息時就可以找到對應賬號(包含密碼),并且在無需輸入密碼的情況下就能成功通過GitHub的權限校驗吠谢,進而成功clone
得到代碼土童。
原因弄清楚之后,解決方式就很簡單了工坊,在Keychain
中刪除個人賬號献汗,然后就正常了。
總結回顧
但是王污,問題真的解決了么罢吃?
并沒有!
簡單粗暴地在Keychain中將個人GitHub賬號刪除了昭齐,雖然再次訪問公司代碼倉庫時正常了尿招,那我要再訪問個人倉庫時該怎么辦呢?
貌似并沒有清晰的思路。雖然網上也有不少操作指導教程就谜,但是對于操作背后的原理怪蔑,還是有很多不清晰的地方。
再回到前面的背景描述丧荐,以及定位問題的整個過程缆瓣,不由地悲從中來。使用GitHub好歹也有好幾年了篮奄,但是連最基本的概念都還一頭霧水捆愁,所以遇到問題后只能靠瞎猜,東碰西撞窟却,最后瞎貓碰到死耗子昼丑。
GitHub的HTTPS
協議和SSH
協議,這本來就對應著兩套完全獨立的權限校驗方式夸赫,而我在HTTPS
協議不正常的情況下還去查看SSH
協議菩帝,這本來就實屬多余。
借助這次“掉坑”的經歷茬腿,我對Git
權限校驗的兩種方式重頭進行了梳理呼奢,并單獨寫了一篇博客,《深入淺出Git權限校驗》切平,雖然花了些時間握础,但總算是掃清了縈繞多年的迷霧,感覺倍兒爽悴品!
如果你也對Git的權限校驗
沒有清晰的了解禀综,遇到權限校驗出錯時只能“換一種方法試試”,也不知道怎么讓一臺計算機同時支持多個GitHub賬號苔严,那么也推薦看下那篇博客定枷。
Read More ...
公眾號:DebugTalk
原文鏈接:http://debugtalk.com/post/trap-in-GitHub-authority-verification
在微信公眾號debugtalk
中輸入Git權限校驗
,獲取《深入淺出Git權限校驗》届氢。