English ▾ 主題 ▾ 最新版本 ▾ gitcredentials 最後更新於 2.51.1

名稱

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

概要

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

描述

Git 有時需要使用者的憑證才能執行操作;例如,存取透過 HTTP 傳輸的遠端儲存庫時,可能需要要求輸入使用者名稱與密碼。部分遠端伺服器接受個人存取權杖(personal access token)或 OAuth 存取權杖作為密碼。本手冊說明 Git 請求這些憑證的機制,以及一些用來避免重複輸入這些憑證的功能。

請求憑證

若未定義任何憑證輔助程式(credential helper),Git 將嘗試透過以下策略向使用者詢問使用者名稱與密碼:

  1. 若設定了 GIT_ASKPASS 環境變數,則會呼叫該變數所指定的程式。適當的提示會透過命令列提供給該程式,使用者的輸入則從其標準輸出讀取。

  2. 否則,若設定了 core.askPass 設定變數,則使用其值,操作如上所述。

  3. 否則,若設定了 SSH_ASKPASS 環境變數,則使用其值,操作如上所述。

  4. 否則,會在終端機中提示使用者輸入。

避免重複輸入

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

  1. 針對特定驗證上下文,以靜態方式設定使用者名稱。

  2. 使用憑證輔助程式來快取或儲存密碼,或是與系統密碼庫(password wallet)或鑰匙圈(keychain)互動。

第一種方法簡單且適合在您沒有安全儲存空間可用於儲存密碼時使用。它通常透過將此設定加入您的組態檔來完成:

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

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

若要使用輔助程式,您必須先選擇一個(請參閱下方的清單)。

您可能也安裝了第三方輔助程式;請在 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 目前包含以下輔助程式:

cache

將憑證短暫地快取在記憶體中。詳細資訊請參閱 git-credential-cache[1]

store

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

具有安全永久儲存功能的熱門輔助程式包括:

  • git-credential-libsecret (Linux)

  • git-credential-osxkeychain (macOS)

  • git-credential-wincred (Windows)

  • Git Credential Manager (跨平台,包含於 Git for Windows 中)

社群維護了一份完整的 Git 憑證輔助程式清單,網址為 https://git-scm.tw/doc/credential-helpers

OAuth

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

具備 OAuth 支援的熱門輔助程式包括:

憑證上下文

Git 將每個憑證視為擁有一個由 URL 定義的上下文。此上下文用於查詢特定於上下文的設定,並傳遞給任何輔助程式,後者可能將其作為安全儲存空間的索引。

例如,假設我們正在存取 https://example.com/foo.git。當 Git 查詢組態檔以查看是否有區段符合此上下文時,若上下文是組態檔中模式(pattern)的更具體子集,它會視為符合。例如,若您的組態檔中有:

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

那麼我們將會匹配:協議相同且主機相同。然而,此上下文將無法匹配:

[credential "https://kernel.linux.club.tw"]
	username = foo

因為主機名稱不同。它也無法匹配 foo.example.com;Git 會精確比對主機名稱,而不考慮兩個主機是否屬於同一個網域。同樣地,針對 http://example.com 的組態項目也不會匹配:Git 會精確比對協議。不過,您可以在網域名稱中使用萬用字元或其他模式比對技術,就像 http.<URL>.* 選項一樣。

若「模式」URL 包含路徑部分,則這必須作為路徑字首進行比對:上下文 https://example.com/bar 將匹配組態項目 https://example.com/bar/baz.git,但不會匹配 https://example.com/other/repo.githttps://example.com/barry/repo.git 的組態項目(即使它是字串字首)。

設定選項

憑證上下文的選項可以設定在 credential.*(適用於所有憑證),或 credential.<URL>.*(其中 <URL> 符合上述定義的上下文)。

以下選項適用於上述任一位置:

helper

外部憑證輔助程式的名稱及其相關選項。若輔助程式名稱不是絕對路徑,則會自動加上字串 git credential-。最終的字串會由 shell 執行(例如,將其設定為 foo --option=bar,將會透過 shell 執行 git credential-foo --option=bar)。詳細使用範例請參閱特定輔助程式的手冊。

若存在多個 credential.helper 設定變數實例,每個輔助程式將會依序嘗試,並可能提供使用者名稱、密碼或不提供任何資訊。一旦 Git 同時獲取了使用者名稱與未過期的密碼,就不會再嘗試後續的輔助程式。

credential.helper 被設定為空字串,則會重設輔助程式清單為空(因此您可以透過設定空字串輔助程式,後面接著您想要的輔助程式清單,來覆寫低優先級組態檔設定的輔助程式)。

username

若 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-」,結果即為命令。

隨後,產生的命令會被附加一個「操作」參數(詳情見下文),並由 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'"

# store helper (discouraged) with custom location for the db file;
# use `--file ~/.git-secret.txt`, rather than `--file=~/.git-secret.txt`,
# to allow the shell to expand tilde to the home directory.
[credential]
	helper = "store --file ~/.git-secret.txt"

# 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 來啟用它。

當輔助程式被執行時,其命令列會被附加一個「操作」參數,該參數為以下其中之一:

get

傳回相符的憑證(若存在)。

store

儲存憑證(若適用於該輔助程式)。

erase

從輔助程式的儲存空間中移除相符的憑證(若存在)。

憑證的詳細資訊將透過輔助程式的 stdin 資料流提供。確切格式與 git credential 管線命令的輸入/輸出格式相同(詳細規格請參閱 git-credential[1] 中的 INPUT/OUTPUT FORMAT 章節)。

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

雖然可以覆寫所有屬性,但表現良好的輔助程式應避免覆寫 username 與 password 以外的任何屬性。

若輔助程式輸出的 quit 屬性值為 true1,則不會再諮詢後續的輔助程式,也不會提示使用者(若未提供任何憑證,操作將會失敗)。

同樣地,一旦同時提供了 username 與 password,就不會再諮詢後續的輔助程式。

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

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

若它不支援該請求操作(例如唯讀儲存空間或產生器),它應靜默地忽略該請求。

若輔助程式收到任何其他操作,它應靜默地忽略該請求。這為未來新增操作預留了空間(舊的輔助程式會直接忽略新的請求)。

GIT

git[1] 套件的一部分