1. 程式人生 > >Git憑證儲存(簡單易懂,一學就會,認真看)

Git憑證儲存(簡單易懂,一學就會,認真看)

今天給自己提了一個問題,當我們在github.com或者gitlab上面新建倉庫,並克隆到本地,首次使用的時候,會被問及使用者名稱密碼,但是這兩個資訊存在哪裡呢?

帶著這個問題,我開始搜尋,並在《Pro Git》7.14 Git-工具-憑證儲存中讀到了完整的解答,但是當我第一次閱讀的時候,並沒有太清楚它所要表達的意思,於是我不斷嘗試後,總算是有所明白。

本文就作為一個解讀貼,作為補充。

憑證儲存究竟要解決什麼問題?

眾所周知,我們通常用SSH和HTTP協議來訪問遠端倉庫。

SSH協議並不採用這裡討論的憑證儲存。這裡重點要描述的其實是HTTP協議下的憑證儲存問題。

為什麼會有這個問題呢?因為git使用HTTP協議訪問遠端倉庫進行操作的時候,每個請求,都需要帶著使用者名稱和密碼以及一個防止重放攻擊的隨機碼。

預設情況下你為什麼沒有被要求每次都輸入使用者名稱密碼?

如果你是Mac系統,git預設是提供osxkeychain輔助程式來管理你的密碼,以至於每次你當你需要提供使用者名稱和密碼的時候,osxkeychain輔助程式都默默幫你填寫了。

如果你是Windows系統,你可能已經安裝了git-credential-winstore了。如果安裝的是GitGUI,則提供的是git-credential-manager

除此之外,你也可以使用git-credential-storegit-credential-cache來管理密碼,前者在檔案中用明文儲存密碼,後者存在記憶體中。

而這幾種方式都可以同時存在。

我們該如何選擇/設定輔助程式的型別?

在回答這個問題前,我們先簡單看一下,什麼是輔助程式?這個翻譯對應的其實是credential.helper配置項,我們可以通過如下命令檢視當前配置:

git config --list | grep credential

Mac,預設會輸出:

include.path=.gitcredential

credential.helper=osxkeychain

對應的也就是Mac的“鑰匙串”系統,我們可以通過Mac系統選單頁面“其他->鑰匙串訪問”功能,搜尋git關鍵字檢視。

Windows安裝GitGUI後,預設會輸出:

credential.helper=manager

接下來,我們再設定一個明文檔案儲存的,也就是store型別的全域性儲存,使用下面的命令來試一下:

git config --global credential.helper store

雖然原文中提到store中提到可以使用--file命令,但是實測在命令列下無效。(原因不未知)

但是可以通過直接編輯配置檔案的方式來達到目的:

設定全域性的:

git config --global -e

設定針對當前專案的:

git config --local -e

然後在[credential]配置節下新增:

helper = store --file $HOME/git-credentials/global.gitcredentials
helper = store

其中,儲存該檔案的路徑必須提前存在。

兩行中,第一行代表指定目錄,第二行代表使用預設路徑

(這裡我們分別對--global和--local都做了設定)

再次執行後

git config --list | grep credential

會輸出(Mac):

include.path=.gitcredential

credential.helper=osxkeychain

credential.helper=store --file $HOME/git-credentials/global.gitcredentials

credential.helper=store

credential.helper=store --file $HOME/git-credentials/v-labs.gitcredentials

也就是說,不僅支援osxkeychain模式,還同時支援了store模式。

為了測試效果,開啟“鑰匙串訪問”程式(如果是Mac的話),搜尋git,把所有出現的都刪掉。

這時候使用git push命令向遠端提交變更。(因為剛剛設定了較多的輔助程式,因此會比較慢)。

這時如果提示輸入使用者名稱密碼,就按正確的值輸入。當你被提示成功後,這期間,我們剛剛輸入的密碼,都被存到了我們設定的所有輔助程式對應的憑證儲存中。

在“鑰匙串訪問”程式中,我們也會看到一條新增的憑證資訊。

我們既然儲存了密碼,那密碼在哪,又是什麼呢?

先來看幾個使用store型別的憑證儲存,它們以文字形式明文存在,我們剛剛既在指定路徑也在預設路徑上進行了設定,那麼我們分別輸入下面三個命令,就可以檢視到密碼了:

localhost:~ volnet$ cd git-credentials/

localhost:git-credentials volnet$ ls
global.gitcredentials   v-labs.gitcredentials

localhost:git-credentials volnet$ cat global.gitcredentials 
https://volnet:[email protected]

localhost:git-credentials volnet$ cat v-labs.gitcredentials 
https://volnet:[email protected]

localhost:git-credentials volnet$ cat ~/.git-credentials 
https://volnet:[email protected]

當然,也可以用《Pro Git》7.14 Git-工具-憑證儲存中提到的git credential-store --file ~/git.store store命令來讀取了。

那麼,使用Mac的osxkeychain的鑰匙串管理,是否可以拿回密碼呢?

答案是肯定的!

localhost:git-credentials volnet$ git credential-osxkeychain get
protocol=https
host=github.com

password=123321
username=volnet

get/store/erase是什麼作用?

《Pro Git》7.14 Git-工具-憑證儲存看,這三個均稱為Action,其實也就是從輔助程式獲取密碼(get)/設定密碼(store)/刪除密碼(erase)。

剛剛的動作中能get到密碼了,那麼我們嘗試刪除一下。執行以下命令試一下:

localhost:v-labs volnet$ git credential-osxkeychain erase
protocol=https
host=github.com

再次用以下程式碼驗證,將沒有返回值。使用“鑰匙串訪問”程式,也將看不到新新增的憑證。

localhost:git-credentials volnet$ git credential-osxkeychain get
protocol=https
host=github.com

那git credential fill是什麼用的?

在每次進行訪問git push(或其他需要使用者名稱密碼的命令)的時候,都會呼叫該方法,它按照由近及遠的思路,嘗試向輔助程式獲取使用者密碼,如果成功,就用這個獲得的使用者密碼去訪問遠端倉庫。如果獲取不到,就會讓使用者輸入一次,並嘗試儲存下來。

因此我們第一次使用的時候,會被提示輸入使用者名稱密碼,就是因為git的內部呼叫了這個命令。

輔助程式是否可以自己定義呢?

按部就班:拿回自己的密碼

前面說了那麼多,都在幫助我們去理解整套憑證體系,這一段用一個連貫的思路來取回自己的密碼:

GC-RMBP:~ volnet$ git config --list | grep credential.helper
credential.helper=osxkeychain
GC-RMBP:~ volnet$ git credential-osxkeychain get
protocol=https
host=github.com

password=123321
username=volnet

其中第二個命令的osxkeychain是由第一個命令得出來的。

剛剛設定了那麼多,我想刪掉那些store儲存怎麼處理?

我們可以使用剛剛直接編輯config檔案的思路,直接修改後儲存。

同時我們需要注意,那些已經被明文儲存的密碼,我們需要自行刪掉。

也可以使用以下命令:

git config --global --unset credential.helper -f
git config --local --unset credential.helper -f
rm -rf $HOME/git-credentials
rm ~/.git-credentials 

使用下面命令驗證,應該已經看不到結果了:

localhost:~ volnet$ git credential-store get
protocol=https
host=github.com

至此,所有關於配置相關的內容都已經解釋完畢。

結論就是,如果不打算明文儲存密碼,就儘量使用SSH的方式。

參考資料

共享編輯

相關推薦

Git憑證儲存簡單易懂認真

今天給自己提了一個問題,當我們在github.com或者gitlab上面新建倉庫,並克隆到本地,首次使用的時候,會被問及使用者名稱密碼,但是這兩個資訊存在哪裡呢? 帶著這個問題,我開始搜尋,並在《Pro Git》7.14 Git-工具-憑證儲存中讀到了完整的解答,但是當我第一次閱讀的時候,並沒有太清楚它所要表

Spring Boot入門系列如何使用攔截器

前面介紹了Spring Boot 如何整合定時任務已經Spring Boot 如何建立非同步任務,不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/1657780.html。 接下來開始講 Spring Boot的重要功能:整合攔截器

超詳細的Nginx簡易教程! 侵立刪

什麼是Nginx? Nginx (engine x) 是一款輕量級的Web 伺服器 、反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器。本文的作者為「靜默虛空」 ,可點選文章底部的閱讀原文關注作者部落格。 什麼是反向代理? 反向代理(Reverse Pr

Excel行列實用技巧超級實用

收藏 http 實用 分享圖片 說明 實用技巧 gif 演示 start Excel,行列技巧工作中經常需要用到,所以我們平時一定要註意積累收藏你不會的那些技巧! Excel錯位引用 在Excel中實現錯位引用,我們舉例說明:在A5單元格輸入=B1,復制公式後所有原始數

手機錯位攝影!零基礎

看到題目你可能會問:什麼是錯位攝影? 錯位是攝影專業術語,運用某些角度對拍攝畫面加以修飾的方法。為了在不同的角度拍攝同一個場景而把人物,道具,佈景的相對位置加以改變。 上圖是國外設計師Mamoizelle創作的關於錯位攝影的教程圖。這張圖清楚地解釋了錯位攝影的一些技巧。我們單看錯位攝影四個字的時候,很難理

之ado.net

content pan http 使用 lang p s 獲取 mdk XML ado.net十一組用於和數據源進行交互的面向對象類庫。數據源能夠是數據庫也能夠是文本文件、excel表格或者XML文件。簡單來說。ado.net就是與不

Eclipse中用Tomcat啟動服務端工程啟動出錯

在Eclipse中用Tomcat啟動服務端工程,一啟動就會出錯,報錯如下: “Server Tomcat v6.0 Server at localhost was unable to start within 45 seconds. If the server requires more tim

機房收費系統之結賬與報表週報表製作《傻瓜版》

如果你對機房收費系統的結賬與日結賬、周結賬的關係資料庫表不清楚、可以先補補課 有錯請及時指出、有錯必改、方便大家! 我們要用一個軟體做報表的模板、然後在VB裡面新增部件、程式碼呼叫模板,

還不搭建高可用redis架構?技術大牛最全總結讓你

題記 Redis 是一個開源的使用 ANSI C 語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value 資料庫,並提供多種語言的 API。   如今,網際網路業務的資料正以更快的速度在增長,資料型別越來越豐富,這對資料處理的速度和能力提出了更高要求。Re

的 WordPress 實戰課

課程簡介本課程是 WordPress 系列基礎實踐課程,目標是帶領讀者上手實戰 WordPress 常用的操作,課程以最常涉及到的方面進行講解:基礎功能、主題開發、外掛開發,以及具體使用中遇到的一些問題的解決方法。認真學完這個系列課程之後,會深入瞭解 WordPress 的使

HTML+CSS樣式設定——CSS

HTML+CSS樣式設定 CSS:(Cascading Style Sheets)層疊樣式設定表。 網頁的展示效果跟其排版有很大的關係。排版則主要依靠CSS來設定、調節。 下面說CSS與HTML的聯合

Nginx 輕鬆 圖文並茂 附案例原始碼

導讀   篇幅較長,乾貨滿滿,需花費較長時間,轉載請註明出處! Nginx概述 簡介   Nginx (engine x) 是一個高效能的HTTP和反向代理web伺服器,同時也提供了IMAP/POP3/SMTP服務。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Rambler.ru

用vue寫一個商城的上貨元件簡單易懂50行js實現效果

0、結果放前面 加個Star後,fork下來。 然後在控制檯,先輸入npm install安裝依賴,再輸入npm run dev執行檢視效果 1、先列需求 一切開發都是基於需求做的,所以需求先行,根據需求設計功能。 需求如下: 上貨商品有多

jdbc連接數據庫以及crud簡單易懂本人親測可用 有源代碼和數據庫

mce 進行 準備 相關 數據庫 進步 重新 可用 簡單 今天呢!重新整理了一邊jdbc的相關操作:現在來說對於很多框架都使用mybatis和hibernate來操作數據庫 ,也有很多使用自己簡單封裝的ssm或者是其他的一些框架來操作數據庫,但是無論使用哪一種 可以說都是

C# 事務處理 簡單易懂

操作 相互 用戶 因此 成功 綁定 執行 對數 序列 事務是並發控制單位,是用戶定義的一個操作序列(這些操作 要麽都做 要麽都不做)通過事務sql server 能將邏輯相關的一組操作綁定在一起,以便服務器保持數據的完整性特性:原子性(Atomicity)原子性是指事務包含

C#中對sqlserver進行增刪改查操作簡單易懂

uid 數據連接 net cti ade 密碼 logs where Go 1、添加引用using System.Data;using System.Data.SqlData;2、建立於數據庫的連接,建議將它做成一個方法,方便多次利用。string sqlconnectio

Python Day 17 常用模塊 時間模塊random模塊os模塊sys模塊序列化模塊

day 倫敦 src 結構化 alt 字符串 hour imp str Python Day 17 (常用模塊一 時間模塊,random模塊,os模塊,sys模塊,序列化模塊) 時間模塊  import time time.time() 時間戳 time.sleep(1

kmp算法原理與應用簡單易懂)

tex font http ont image inf csdn 簡單 算法 kmp算法原理與應用(簡單易懂)

vue專案轉換成pdf檔案簡單易懂

1,新增兩個模組html2canvas和jspdf     (1)npm install --save html2canvas(將頁面html轉換成圖片)     (2)npm install --save