一民效、出現(xiàn)問題:git push的時候沒有權(quán)限
最近在研究組件化方案的時候区岗,按照大神的步驟一步一步來,過程中遇到了很多問題眠菇。當(dāng)然這篇文章不是說組件化的边败,關(guān)于組件化的過程過幾天再做個筆記,然后分享出來捎废。
這里主要說一下 git 的 https 鏈接無法交互的問題笑窜,我在 coding (因為free,所以沒用 github )上創(chuàng)建了私有 Repo 之后根本無法 push (私有 Repo 連 clone 都不行)登疗,因為大神給的 demo 在和遠(yuǎn)程倉庫交互的時候用的是 https 鏈接排截,為什么我也用 https 鏈接就不可以呢嫌蚤?
后來嘗試使用 ssh 鏈接,然后重新配置公鑰上傳到 coding.net 上断傲,就解決了和遠(yuǎn)端倉庫交互的問題脱吱。可是換回 https 鏈接之后就不可以了(因為 ssh 鏈接會報防火墻的警告认罩,雖然沒什么大影響急凰,但是我有病,非想試試 https) 猜年。
如果 Repo 的鏈接是 https 的話,我總會得到這個錯誤:
unable to access ' https://git.coding.net/xxxx/xxxx.git/ ': The requested URL returned error: 403
當(dāng)然 https 肯定要輸入用戶名和密碼的疾忍,它就是靠這個去校驗的乔外。我也想輸入啊,可是系統(tǒng)不給我機會一罩。后來隨便在 github 上創(chuàng)建了公有庫杨幼,讓同事 clone 下來,然后 push聂渊,這個時候是需要他輸入用戶名和密碼的差购。但是第一次輸入密碼后,就不會再提醒他再次輸入了汉嗽。顯而易見是因為我的電腦緩存了我的 github 用戶名和密碼欲逃,所以才千萬次的報403錯誤。
二 饼暑、理解 git 用戶名密碼緩存原理
為了方便 git 使用 https 方式傳輸代碼的時候不用每次都輸入用戶名和密碼稳析,所以一般 git 會儲存用戶的用戶名。 儲存方式有緩存cache弓叛,保存在硬盤store彰居,和保存在鑰匙串osxkeychain中。
這篇文章翻譯了git 關(guān)于 credentials 的介紹,里面詳細(xì)說明了git 是如何尋找用戶輸入過的用戶名和密碼的,可以看一下明白 git 記錄密碼的原理撰筷。如果你不想看這篇文章陈惰,那么大概理解幾個概念就好:
1. git 去找系統(tǒng)是否緩存了用戶的密碼有三種策略:去緩存中找,去磁盤中找毕籽,去鑰匙串中找抬闯。
2. /Users/xxx/.gitconfig 文件中(這個文件如果沒設(shè)置過git 的全局配置可能會不存在),配置了git 到底選擇哪個策略去找用戶名和密碼关筒。
3. 通過編輯 .gitconfig 文件画髓,credential.helper = store/cache/osxkeychain 來修改 git 緩存策略。
理解了上面的概念后可以執(zhí)行這個命令查看自己系統(tǒng)支持的crendential(憑證)平委,
git help -a | grep credential
得到結(jié)果:
然后可以執(zhí)行
git config --list
查看自己電腦的 git 的全局配置,可以看到credential.helper=(你自己電腦的配置)
如果你切換到 git 項目的文件夾里再使用 git config --list
可以看到對應(yīng)項目的配置信息奈虾,紅色是電腦的 global credential 配置,綠色的是當(dāng)前 git 項目的 credential 配置(可以多個)
三、解決問題
1. 清空配置
知道了這些之后肉微,再解決這個問題就簡單了匾鸥,既然 git 是依靠credential.helper 配置去找用戶名密碼,那我直接不用這個配置不就會要求重新輸入用戶名和密碼了嗎碉纳? 打開 /Users/xxx/.gitconfig 文件勿负,如果顯示隱藏文件后還是找不到這個文件,那么可以使用以下任意的命令劳曹,成功后會在你的HOME路徑下出現(xiàn)這個文件奴愉,
// 配置git 的缺省編輯器 例如:emacs
$ git config --global core.editor emacs
//配置git 的用戶名和郵箱
$ git config --global user.name "xxxxxx"
$ git config --global user.email "xxxx@.com"
執(zhí)行這些命令后就能生成.gitconfig 配置文件,然后文本編輯器打開.gitconfig文件,清除里面的命令行生成的內(nèi)容铁孵。
如果你的電腦本來就有.gitconfig文件, 找到下面這句話刪除锭硼,保存退出。
[credential] helper = xxx
這個時候輸入命令
git config credential.helper
查看本機的credential 是否已經(jīng)被清空蜕劝。
如果輸入了 git config credential.helper
命令之后還是出現(xiàn)了osxkeychain檀头, store 或者 cache 等,說明 git 的配置還是沒有被清空岖沛,我參考了stackOverFlow上這個問題 有人給了這樣一個命令查看 credential.helper 所在的文件目錄(可能一個電腦上有多個.gitconfig文件)暑始,
git config --show-origin --get credential.helper
file:/Applications/Xcode.app/Contents/Developer/usr/share/git-core/gitconfig osxkeychain
如果你的Mac上還有Xcode的話,那么Xcode中還會有一個.gitconfig文件婴削,找出他然后打開廊镜,清空[credential]。
再次輸入
git config credential.helper
如果沒有任何反應(yīng)唉俗,那么 credential 就是已經(jīng)清空了期升,這個時候你無論在任何依托 git 的代碼托管網(wǎng)站上 push 都會要求你輸入用戶名和密碼了,而且每次都會要求你輸入互躬,是不是又有新的煩惱了呢播赁?
2. 重新配置
理解了git 保存密碼的原理,那我們可以按照自己的想法設(shè)置了吼渡,如上所述容为,可以設(shè)置成cache,store寺酪,keychain坎背,這里我說下保存在磁盤中(store)和鑰匙串中(keychain)兩種方式。
- 配置成store
命令
git config --global credential.helper store
或者 /Users/xxx/.gitconfig 打開.gitsonfig直接修改文件credential.helper=store
然后第一次push 的時候會提示輸入用戶名密碼寄雀,輸入完成之后/Users/xxx/ 文件夾下會生成一個新的文件.git-credentials得滤,雙擊打開,里面保存了你的用戶名密碼等信息:
https://用戶名:密碼@網(wǎng)址
但是這種儲存方式盒犹,在本地只會儲存一個用戶名和密碼懂更,例如我本地.git-credentials文件的內(nèi)容是
https://用戶名1:密碼1@git.coding.net
那我如果想 push 到 github 上眨业,又要重新輸入用戶名密碼,你可以再次在 .git-credentials 文件中添加一個 url沮协,格式是一樣的龄捡,這次的用戶名和密碼改成你的 github 用戶名和密碼
https://用戶名2:密碼2@github.com
注意:如果在設(shè)置成global store之前/Users/xxx/ 文件夾中如果已經(jīng)有了.git-credentials 文件,最好先刪除慷暂,防止系統(tǒng)自動去那里尋找用戶名密碼聘殖。
- 配置成osxkeychain
命令
git config --global credential.helper osxkeychain
也或者/Users/xxx/.gitconfig 打開 .gitconfig 直接修改文件。
這個時候 git 是從你的鑰匙串中訪問儲存的密碼行瑞,同理如果第一次在鑰匙串中沒有找到用戶名密碼奸腺,則要求你輸入,輸入之后下次就不用再次輸入啦血久。
與 store 方式不同的是(你的每個平臺用戶名和密碼都不一樣):
假如第一次 push 到 github突照,那么 keychain 記錄了 github 的用戶名密碼,
第二次你想推送 coding洋魂,那么 keychain 沒有 coding 的用戶名密碼,就會要求你再次輸入喜鼓。只是 store 的方式????? 我們需要手動添加 url副砍,這里不用了。
我們可以查看 Mac 上的鑰匙串庄岖,push 一次后就會新出先一個對應(yīng)網(wǎng)站的鑰匙串豁翎,你也可以雙擊訪問,查看密碼隅忿。
注意: 如果在/Users/xxx/ 文件夾中已經(jīng)有了 .git-credentials 文件心剥,要先刪除,否則系統(tǒng)自動去那里尋找用戶名密碼背桐。
這樣就解決了git 緩存密碼后所帶來的問題优烧。希望對你有所幫助!