Git
英文 ▾ 主題 ▾ 最新版本 ▾ gitcredentials 最後更新於 2.42.0

名稱

gitcredentials - 提供 Git 使用者名稱和密碼

概要

git config credential.https://example.com.username myusername
git config credential.helper "$helper $options"

描述

Git 有時需要使用者提供憑證才能執行操作;例如,它可能需要要求使用者輸入使用者名稱和密碼,才能透過 HTTP 存取遠端儲存庫。某些遠端接受個人存取權杖或 OAuth 存取權杖作為密碼。本手冊描述 Git 用於請求這些憑證的機制,以及避免重複輸入這些憑證的一些功能。

請求憑證

在未定義任何憑證助手的情況下,Git 會嘗試以下策略來要求使用者提供使用者名稱和密碼

  1. 如果設定了 GIT_ASKPASS 環境變數,則會調用該變數指定的程式。該程式的命令列會提供適當的提示,而使用者的輸入會從其標準輸出讀取。

  2. 否則,如果設定了 core.askPass 配置變數,則會像上述一樣使用其值。

  3. 否則,如果設定了 SSH_ASKPASS 環境變數,則會像上述一樣使用其值。

  4. 否則,將在終端機上提示使用者。

避免重複

重複輸入相同的憑證可能會很麻煩。Git 提供了兩種方法來減少這種困擾

  1. 針對給定的驗證情境,靜態配置使用者名稱。

  2. 憑證助手,用於快取或儲存密碼,或與系統密碼錢包或鑰匙串互動。

第一種方法很簡單,如果你沒有可安全儲存密碼的方式,則適用。它通常透過將此加入你的 config 來配置

[credential "https://example.com"]
	username = me

另一方面,憑證助手是 Git 可以從中請求使用者名稱和密碼的外部程式;它們通常與作業系統或其他程式提供的安全儲存介面。或者,憑證產生助手可能會透過某些 API 為特定伺服器產生憑證。

若要使用助手,你必須先選擇一個要使用的助手。Git 目前包含以下助手

快取

在記憶體中快取憑證一小段時間。詳情請參閱 git-credential-cache[1]

儲存

將憑證無限期儲存在磁碟上。詳情請參閱 git-credential-store[1]

你也可能安裝了協力廠商助手;在 git help -a 的輸出中搜尋 credential-*,並參考個別助手的檔案。選擇助手後,你可以將其名稱放入 credential.helper 變數中,告訴 Git 使用它。

  1. 尋找助手。

    $ git help -a | grep credential-
    credential-foo
  2. 閱讀其描述。

    $ git help credential-foo
  3. 告訴 Git 使用它。

    $ git config --global credential.helper foo

可用的助手

社群維護了一份 Git 憑證助手的完整清單,位於 https://git.dev.org.tw/doc/credential-helpers

OAuth

輸入密碼或個人存取權杖的替代方案是使用 OAuth 憑證助手。初始驗證會開啟主機的瀏覽器視窗。後續的驗證會在背景中進行。許多熱門的 Git 主機都支援 OAuth。

憑證情境

Git 認為每個憑證都有一個由 URL 定義的情境。此情境用於查閱情境特定的配置,並傳遞給任何助手,助手可以將其用作安全儲存的索引。

例如,假設我們要存取 https://example.com/foo.git。當 Git 查閱設定檔,以查看是否有區段符合此情境時,如果情境是設定檔中模式的更具體的子集,它會將兩者視為匹配。例如,如果你的設定檔中有這個

[credential "https://example.com"]
	username = foo

那麼我們會匹配:兩種協議相同、兩種主機相同,且「模式」URL 完全不關心路徑元件。但是,此情境不會匹配

[credential "https://kernel.org"]
	username = foo

因為主機名稱不同。它也不會匹配 foo.example.com;Git 會完全比較主機名稱,而不考慮兩個主機是否屬於同一個網域。同樣地,http://example.com 的設定條目也不會匹配:Git 會完全比較協議。但是,你可以在網域名稱中使用萬用字元,以及其他模式比對技術,就像使用 http.<URL>.* 選項一樣。

如果「模式」URL 確實包含路徑元件,那麼這也必須完全匹配:情境 https://example.com/bar/baz.git 將會匹配 https://example.com/bar/baz.git 的設定條目(除了匹配 https://example.com 的設定條目之外),但不會匹配 https://example.com/bar 的設定條目。

配置選項

憑證情境的選項可以在 credential.*(適用於所有憑證)或 credential.<URL>.* 中配置,其中 <URL> 會按照上述描述匹配情境。

以下選項在任一位置都可用

助手

外部憑證助手的名稱,以及任何相關的選項。如果助手名稱不是絕對路徑,則會預先加上字串 git credential-。結果字串會由 shell 執行(因此,例如,將其設定為 foo --option=bar 將會透過 shell 執行 git credential-foo --option=bar。請參閱特定助手的說明文件,以了解其使用範例。

如果有多個 credential.helper 配置變數的實例,則會依序嘗試每個助手,並且可能會提供使用者名稱、密碼或不提供任何內容。一旦 Git 取得使用者名稱和未過期的密碼,就不會再嘗試其他助手。

如果將 credential.helper 配置為空字串,這會將助手清單重設為空(因此,你可以透過配置空字串助手,然後配置你想要的任何助手集,來覆寫較低優先順序的設定檔設定的助手)。

使用者名稱

預設的使用者名稱,如果 URL 中未提供。

useHttpPath

預設情況下,Git 不會認為 http URL 的「路徑」元件值得透過外部助手進行匹配。這表示為 https://example.com/foo.git 儲存的憑證也將用於 https://example.com/bar.git。如果你確實想要區分這些情況,請將此選項設定為 true

自訂助手

你可以編寫自己的自訂助手,以與你儲存憑證的任何系統介面。

憑證輔助程式是由 Git 執行的程式,用於從長期儲存裝置(此處「長期」僅指比單一 Git 處理程序更長的時間;例如,憑證可能會在記憶體中儲存幾分鐘,或無限期地儲存在磁碟上)提取憑證或將憑證儲存至長期儲存裝置。

每個輔助程式都由組態變數 credential.helper 中的單一字串指定(以及其他變數,請參閱git-config[1])。Git 會使用以下規則將此字串轉換為要執行的命令:

  1. 如果輔助程式字串以「!」開頭,則會將其視為 shell 片段,「!」之後的所有內容都會成為命令。

  2. 否則,如果輔助程式字串以絕對路徑開頭,則會逐字將輔助程式字串作為命令。

  3. 否則,字串「git credential-」會附加到輔助程式字串前面,而結果會成為命令。

然後,產生的命令會附加一個「operation」引數(詳情請見下方),而結果會由 shell 執行。

以下是一些範例規格:

# run "git credential-foo"
[credential]
	helper = foo

# same as above, but pass an argument to the helper
[credential]
	helper = "foo --bar=baz"

# the arguments are parsed by the shell, so use shell
# quoting if necessary
[credential]
	helper = "foo --bar='whitespace arg'"

# you can also use an absolute path, which will not use the git wrapper
[credential]
	helper = "/path/to/my/helper --with-arguments"

# or you can specify your own shell snippet
[credential "https://example.com"]
	username = your_user
	helper = "!f() { test \"$1\" = get && echo \"password=$(cat $HOME/.secret)\"; }; f"

一般來說,上面的規則 (3) 對使用者而言是最簡單的指定方式。憑證輔助程式的作者應盡力協助其使用者,方法是將其程式命名為「git-credential-$NAME」,並在安裝期間將其置於 $PATH$GIT_EXEC_PATH 中,這會允許使用者使用 git config credential.helper $NAME 來啟用它。

執行輔助程式時,會在命令列中附加一個「operation」引數,其值為下列其中一個:

get

傳回相符的憑證(如果有的話)。

store

儲存憑證(如果適用於輔助程式)。

erase

從輔助程式的儲存空間移除任何相符的憑證(如果有的話)。

憑證的詳細資料會在輔助程式的 stdin 串流中提供。確切的格式與 git credential 管道命令的輸入/輸出格式相同(如需詳細規格,請參閱git-credential[1]中的「INPUT/OUTPUT FORMAT」章節)。

對於 get 操作,輔助程式應以相同的格式在 stdout 上產生屬性清單(如需常見屬性,請參閱git-credential[1])。如果輔助程式沒有任何可提供的實用資訊,則可以自由產生子集,甚至不產生任何值。任何提供的屬性都會覆寫 Git 憑證子系統已知的屬性。無法辨識的屬性會被靜默捨棄。

雖然可以覆寫所有屬性,但行為良好的輔助程式應避免對使用者名稱和密碼以外的任何屬性執行此操作。

如果輔助程式輸出一個值為 true1quit 屬性,則不會諮詢其他輔助程式,也不會提示使用者(如果未提供任何憑證,則操作將會失敗)。

同樣地,一旦提供了使用者名稱和密碼,就不會再諮詢其他輔助程式。

對於 storeerase 操作,輔助程式的輸出會被忽略。

如果輔助程式無法執行要求的操作,或需要通知使用者潛在的問題,則可以寫入 stderr。

如果它不支援要求的操作(例如,唯讀儲存或產生器),則應靜默忽略該要求。

如果輔助程式收到任何其他操作,則應靜默忽略該要求。這為將來新增的操作留下空間(較舊的輔助程式只會忽略新的要求)。

GIT

屬於 git[1] 套件的一部分

scroll-to-top