git credential approve
について、 git (2.28.0 macOS)では、ユーザ名が与えられていない場合、credential ヘルパーを呼び出すことさえありません。:
The credential.helper
のキーはマルチセットの値を持っているので、新しい値を追加しても、古い値はそのまま維持されます。 git 2.9 からは、空の文字列を指定すると、それまでに定義されていたヘルパーが削除されるようになりました。
ユーザ名や複数のユーザをサポートすることを念頭に置いています。
cache
このヘルパーは、Windows のデフォルトの git インストーラーには含まれていません。 :(
このようにして、特定のリポジトリに対して cache
を設定することができます。:
❯ mkdir foo
❯ cd foo
❯ git init .
11:43:28.618841 git.c:444 trace: built-in: git init .
Initialized empty Git repository in /private/tmp/foo/.git/
❯ git config --add credential.helper ""
11:43:50.682962 git.c:444 trace: built-in: git config --add credential.helper ''
❯ git config --add credential.helper cache
11:43:54.577707 git.c:444 trace: built-in: git config --add credential.helper cache
❯ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[credential]
helper =
helper = cache
では、credential を追加しましょう。:
❯ (echo url=https://github.com; echo username=token; echo password=secret; echo ) | git credential approve
11:45:16.813913 git.c:444 trace: built-in: git credential approve
11:45:16.814431 run-command.c:663 trace: run_command: 'git credential-cache store'
11:45:16.823008 git.c:704 trace: exec: git-credential-cache store
11:45:16.823637 run-command.c:663 trace: run_command: git-credential-cache store
11:45:16.842902 run-command.c:663 trace: run_command: git-credential-cache--daemon /Users/gaborcsardi/.cache/git/credential/socket
❯ (echo url=https://github.com; echo username=token2; echo password=secret2; echo ) | git credential approve
11:45:28.927712 git.c:444 trace: built-in: git credential approve
11:45:28.928108 run-command.c:663 trace: run_command: 'git credential-cache store'
11:45:28.937087 git.c:704 trace: exec: git-credential-cache store
11:45:28.937695 run-command.c:663 trace: run_command: git-credential-cache store
ユーザ名ありのクエリが成功しました。:
❯ (echo url=https://token@github.com; echo ) | git credential fill
11:46:40.689122 git.c:444 trace: built-in: git credential fill
11:46:40.689638 run-command.c:663 trace: run_command: 'git credential-cache get'
11:46:40.696784 git.c:704 trace: exec: git-credential-cache get
11:46:40.697333 run-command.c:663 trace: run_command: git-credential-cache get
protocol=https
host=github.com
username=token
password=secret
❯ (echo url=https://token2@github.com; echo ) | git credential fill
11:46:43.767002 git.c:444 trace: built-in: git credential fill
11:46:43.767676 run-command.c:663 trace: run_command: 'git credential-cache get'
11:46:43.778637 git.c:704 trace: exec: git-credential-cache get
11:46:43.779201 run-command.c:663 trace: run_command: git-credential-cache get
protocol=https
host=github.com
username=token2
password=secret2
ユーザ名を含まないクエリも動作し、何らかの credential を返します。:
❯ (echo url=https://github.com; echo ) | git credential fill
11:45:58.200272 git.c:444 trace: built-in: git credential fill
11:45:58.200667 run-command.c:663 trace: run_command: 'git credential-cache get'
11:45:58.208372 git.c:704 trace: exec: git-credential-cache get
11:45:58.208919 run-command.c:663 trace: run_command: git-credential-cache get
protocol=https
host=github.com
username=token
password=secret
❯ (echo url=https://token@github.com; echo ) | git credential reject
11:47:03.921697 git.c:444 trace: built-in: git credential reject
11:47:03.922530 run-command.c:663 trace: run_command: 'git credential-cache erase'
11:47:03.935858 git.c:704 trace: exec: git-credential-cache erase
11:47:03.936400 run-command.c:663 trace: run_command: git-credential-cache erase
❯ (echo url=https://github.com; echo ) | git credential fill
11:47:10.018877 git.c:444 trace: built-in: git credential fill
11:47:10.019386 run-command.c:663 trace: run_command: 'git credential-cache get'
11:47:10.027990 git.c:704 trace: exec: git-credential-cache get
11:47:10.028572 run-command.c:663 trace: run_command: git-credential-cache get
protocol=https
host=github.com
username=token2
password=secret2
store
repo 設定:
❯ mkdir foo
❯ cd foo
❯ git init .
11:53:48.042569 git.c:444 trace: built-in: git init .
Initialized empty Git repository in /private/tmp/foo/.git/
❯ git config --add credential.helper ""
11:53:52.949914 git.c:444 trace: built-in: git config --add credential.helper ''
❯ git config --add credential.helper store
11:53:56.682348 git.c:444 trace: built-in: git config --add credential.helper store
❯ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[credential]
helper =
helper = store
credential を追加:
❯ (echo url=https://github.com; echo username=token; echo password=secret; echo ) | git credential approve
11:54:44.184929 git.c:444 trace: built-in: git credential approve
11:54:44.185729 run-command.c:663 trace: run_command: 'git credential-store store'
11:54:44.197920 git.c:704 trace: exec: git-credential-store store
11:54:44.198471 run-command.c:663 trace: run_command: git-credential-store store
/tmp/foo master
❯ (echo url=https://github.com; echo username=token2; echo password=secret2; echo ) | git credential approve
11:54:48.452942 git.c:444 trace: built-in: git credential approve
11:54:48.453399 run-command.c:663 trace: run_command: 'git credential-store store'
11:54:48.463535 git.c:704 trace: exec: git-credential-store store
11:54:48.464004 run-command.c:663 trace: run_command: git-credential-store store
ユーザ名のあるクエリ:
❯ (echo url=https://token@github.com; echo ) | git credential fill
11:55:21.191654 git.c:444 trace: built-in: git credential fill
11:55:21.192357 run-command.c:663 trace: run_command: 'git credential-store get'
11:55:21.204279 git.c:704 trace: exec: git-credential-store get
11:55:21.205063 run-command.c:663 trace: run_command: git-credential-store get
protocol=https
host=github.com
username=token
password=secret
❯ (echo url=https://token2@github.com; echo ) | git credential fill
11:55:24.194096 git.c:444 trace: built-in: git credential fill
11:55:24.194654 run-command.c:663 trace: run_command: 'git credential-store get'
11:55:24.207028 git.c:704 trace: exec: git-credential-store get
11:55:24.207643 run-command.c:663 trace: run_command: git-credential-store get
protocol=https
host=github.com
username=token2
password=secret2
ユーザ名を含まないクエリは、何らかの認証情報を返しますが、明らかに最初に設定されたものではありません。:
❯ (echo url=https://github.com; echo ) | git credential fill
11:56:12.394594 git.c:444 trace: built-in: git credential fill
11:56:12.394949 run-command.c:663 trace: run_command: 'git credential-store get'
11:56:12.403303 git.c:704 trace: exec: git-credential-store get
11:56:12.403863 run-command.c:663 trace: run_command: git-credential-store get
protocol=https
host=github.com
username=token2
password=secret2
❯ (echo url=https://token2@github.com; echo ) | git credential reject
11:56:24.065910 git.c:444 trace: built-in: git credential reject
11:56:24.066314 run-command.c:663 trace: run_command: 'git credential-store erase'
11:56:24.074851 git.c:704 trace: exec: git-credential-store erase
11:56:24.076875 run-command.c:663 trace: run_command: git-credential-store erase
❯ (echo url=https://github.com; echo ) | git credential fill
11:56:26.438444 git.c:444 trace: built-in: git credential fill
11:56:26.438839 run-command.c:663 trace: run_command: 'git credential-store get'
11:56:26.446181 git.c:704 trace: exec: git-credential-store get
11:56:26.446721 run-command.c:663 trace: run_command: git-credential-store get
protocol=https
host=github.com
username=token
password=secret
osxkeychain
Some docs: https://docs.github.com/en/github/using-git/updating-credentials-from-the-osx-keychain
これは現在(git 2.28.0)、macOSのデフォルトヘルパーです。
このようにして、credential を保存します。:
git サブコマンドとしてインストールされるので、内部のapiを直接呼び出すことができます。:
❯ git credential-osxkeychain
11:50:56.325499 git.c:704 trace: exec: git-credential-osxkeychain
11:50:56.325783 run-command.c:663 trace: run_command: git-credential-osxkeychain
usage: git credential-osxkeychain <get|store|erase>
credential を設定する際には、いつものように username
が必要です。
ホストにマッチする何らかのトークンを得るために、username
を指定する必要はありません。 これはクリーンなキーチェーンに入っています。 まず、二つの credential を設定します。:
❯ (echo url=https://github.com; echo username=token; echo password=secret; echo ) | git credential approve
10:48:47.187164 git.c:444 trace: built-in: git credential approve
10:48:47.187691 run-command.c:663 trace: run_command: 'git credential-osxkeychain store'
10:48:47.197964 git.c:704 trace: exec: git-credential-osxkeychain store
10:48:47.198518 run-command.c:663 trace: run_command: git-credential-osxkeychain store
❯ (echo url=https://github.com; echo username=token2; echo password=secret2; echo ) | git credential approve
10:48:55.299933 git.c:444 trace: built-in: git credential approve
10:48:55.300282 run-command.c:663 trace: run_command: 'git credential-osxkeychain store'
10:48:55.308568 git.c:704 trace: exec: git-credential-osxkeychain store
10:48:55.309276 run-command.c:663 trace: run_command: git-credential-osxkeychain store
ユーザ名を入力しない場合は、そのうちの1つを取得します。:
❯ (echo url=https://github.com; echo ) | git credential fill
10:49:17.371636 git.c:444 trace: built-in: git credential fill
10:49:17.372021 run-command.c:663 trace: run_command: 'git credential-osxkeychain get'
10:49:17.378688 git.c:704 trace: exec: git-credential-osxkeychain get
10:49:17.379164 run-command.c:663 trace: run_command: git-credential-osxkeychain get
protocol=https
host=github.com
username=token
password=secret
ユーザ名を入力する場合は、正しいユーザ名を取得します。:
❯ (echo url=https://token2@github.com; echo ) | git credential fill
10:49:28.613779 git.c:444 trace: built-in: git credential fill
10:49:28.614108 run-command.c:663 trace: run_command: 'git credential-osxkeychain get'
10:49:28.621440 git.c:704 trace: exec: git-credential-osxkeychain get
10:49:28.621979 run-command.c:663 trace: run_command: git-credential-osxkeychain get
protocol=https
host=github.com
username=token2
password=secret2
ユーザ名がなくても任意のものが得られることを確認するために、token
を削除してみましょう。:
❯ (echo url=https://token@github.com; echo ) | git credential reject
10:49:58.584332 git.c:444 trace: built-in: git credential reject
10:49:58.586880 run-command.c:663 trace: run_command: 'git credential-osxkeychain erase'
10:49:58.598463 git.c:704 trace: exec: git-credential-osxkeychain erase
10:49:58.599214 run-command.c:663 trace: run_command: git-credential-osxkeychain erase
```sh
❯ (echo url=https://github.com; echo ) | git credential fill
10:50:07.468385 git.c:444 trace: built-in: git credential fill
10:50:07.468728 run-command.c:663 trace: run_command: 'git credential-osxkeychain get'
10:50:07.478398 git.c:704 trace: exec: git-credential-osxkeychain get
10:50:07.478832 run-command.c:663 trace: run_command: git-credential-osxkeychain get
protocol=https
host=github.com
username=token2
password=secret2
では、osxkeychain
が token
を優先しないように、トークンを再設定しましょう。:
❯ (echo url=https://github.com; echo username=token; echo password=secret; echo ) | git credential approve
10:58:52.302066 git.c:444 trace: built-in: git credential approve
10:58:52.311063 run-command.c:663 trace: run_command: 'git credential-osxkeychain store'
10:58:52.321633 git.c:704 trace: exec: git-credential-osxkeychain store
10:58:52.322108 run-command.c:663 trace: run_command: git-credential-osxkeychain store
❯ (echo url=https://github.com; echo ) | git credential fill
10:58:57.316418 git.c:444 trace: built-in: git credential fill
10:58:57.317630 run-command.c:663 trace: run_command: 'git credential-osxkeychain get'
10:58:57.330142 git.c:704 trace: exec: git-credential-osxkeychain get
10:58:57.330697 run-command.c:663 trace: run_command: git-credential-osxkeychain get
protocol=https
host=github.com
username=token2
password=secret2
そのため、osxkeychain
は任意のもの、または最初に追加されたものを見つけるだけのようです。
manager-core
(macOS)デフォルトではインストールされません (git 2.28.0)。
brew でのインストール。インストール方法: https://github.com/microsoft/Git-Credential-Manager-Core#macos-homebrew
この場合、グローバルな git 設定を更新し、これらの行を追加します。:
[credential]
helper = ""
[credential "https://dev.azure.com"]
useHttpPath = true
[credential]
helper = manager-core
helper = ""
行は、以前のハンドラを削除します。 システムヘルパーは、 osxkeychain
に保持されます。
git サブコマンドとしてインストールされ、内部のAPIを直接呼び出すことができます。:
❯ git credential-manager-core
11:51:56.434300 git.c:704 trace: exec: git-credential-manager-core
11:51:56.434496 run-command.c:663 trace: run_command: git-credential-manager-core
Missing command.
usage: git-credential-manager-core <command>
Available commands:
erase
get
store
configure [--system]
unconfigure [--system]
--version, version
--help, -h, -?
これは、キーチェーンの異なるキーを使用するため、osxkeychain
ヘルパーとは互換性がありません。
これは、異なる provider をサポートします。 provider は、デフォルトでは自動的に検索されます。 GitHub は、独自の provider を持っており、github.com
URLから検索されます。 provider は、git configure key または環境変数で設定することができます。: https://github.com/microsoft/Git-Credential-Manager-Core/blob/master/docs/configuration.md#credentialprovider
namepace (manager
など) は、現在のところサポートされていません。
これは、credential を保存する方法です。:
Name: git:https://github.com
Kind: application password
Account: token
Where: git:https://github.com
何らかの credential を得るために username
を指定する必要はありません。:
❯ (echo url=https://github.com; echo ) | git credential fill
11:24:47.750966 git.c:444 trace: built-in: git credential fill
11:24:47.753268 run-command.c:663 trace: run_command: 'git credential-manager-core get'
11:24:47.762249 git.c:704 trace: exec: git-credential-manager-core get
11:24:47.762917 run-command.c:663 trace: run_command: git-credential-manager-core get
protocol=https
host=github.com
username=token
password=secret
複数の crendential がある場合は、ランダムな credential(または最初に設定された credential)が返されます。
❯ (echo url=https://github.com; echo username=token2; echo password=secret2; echo ) | git credential approve
11:25:41.553761 git.c:444 trace: built-in: git credential approve
11:25:41.554242 run-command.c:663 trace: run_command: 'git credential-manager-core store'
11:25:41.565748 git.c:704 trace: exec: git-credential-manager-core store
11:25:41.566218 run-command.c:663 trace: run_command: git-credential-manager-core store
実際、少なくとも GitHub プロバイダでは credential を取得する際にユーザ名は完全に無視されます。:
❯ (echo url=https://token2@github.com; echo ) | git credential fill
11:29:49.274574 git.c:444 trace: built-in: git credential fill
11:29:49.275020 run-command.c:663 trace: run_command: 'git credential-manager-core get'
11:29:49.283563 git.c:704 trace: exec: git-credential-manager-core get
11:29:49.284236 run-command.c:663 trace: run_command: git-credential-manager-core get
protocol=https
host=github.com
username=token
password=secret
これは、GitHubプロバイダーがユーザ名をURLの一部として保存していないためです。 関連する問題です: https://github.com/microsoft/Git-Credential-Manager-Core/issues/160 manager
にも同様の問題があり、この GitHub の問題からリンクされています。
プロバイダーを Generic に設定すると、ユーザ名は期待通りに動作します。 この場合は、keychain に保存されます。
Name: git:https://token@github.com/
Kind: application password
Account: token
Where: git:https://token@github.com/
これらの credential は、GitHubプロバイダーが設定したものとは互換性がありません。
❯ export GCM_PROVIDER=generic
❯ (echo url=https://github.com; echo username=token; echo password=secret; echo ) | git credential approve
11:34:15.998644 git.c:444 trace: built-in: git credential approve
11:34:15.998992 run-command.c:663 trace: run_command: 'git credential-manager-core store'
11:34:16.008178 git.c:704 trace: exec: git-credential-manager-core store
11:34:16.008834 run-command.c:663 trace: run_command: git-credential-manager-core store
❯ (echo url=https://github.com; echo username=token2; echo password=secret2; echo ) | git credential approve
11:35:52.629963 git.c:444 trace: built-in: git credential approve
11:35:52.637966 run-command.c:663 trace: run_command: 'git credential-manager-core store'
11:35:52.648058 git.c:704 trace: exec: git-credential-manager-core store
11:35:52.648514 run-command.c:663 trace: run_command: git-credential-manager-core store
❯ (echo url=https://token@github.com; echo ) | git credential fill
11:35:58.336428 git.c:444 trace: built-in: git credential fill
11:35:58.336881 run-command.c:663 trace: run_command: 'git credential-manager-core get'
11:35:58.345187 git.c:704 trace: exec: git-credential-manager-core get
11:35:58.345729 run-command.c:663 trace: run_command: git-credential-manager-core get
protocol=https
host=github.com
username=token
password=secret
❯ (echo url=https://token2@github.com; echo ) | git credential fill
11:36:02.550339 git.c:444 trace: built-in: git credential fill
11:36:02.550695 run-command.c:663 trace: run_command: 'git credential-manager-core get'
11:36:02.557777 git.c:704 trace: exec: git-credential-manager-core get
11:36:02.558359 run-command.c:663 trace: run_command: git-credential-manager-core get
protocol=https
host=github.com
username=token2
password=secret2
manager-core
(macOS), 2.0.246-beta or laterusername
を保存しません。generic
と github
の両方のプロバイダで、username
を account
として保存し、クレデンシャルを検索する際に使用します。manager-core
(Windows 2.0.246-beta より前)デフォルトではインストールされていませんが(git 2.28.0)、これが将来の正規の実装になると思われます。 macOS 版については上記を参照してください.
動作は manager
と似ていて,特に違いは見られませんでした(バージョンは 2.0.194.40577). 権限の代わりに、プロバイダを設定する必要があります。https://github.com/microsoft/Git-Credential-Manager-Core/blob/master/docs/migration.md#gcm_authority. Generic
プロバイダは、manager
の Basic
権限と同じように動作します。
残念ながら GCM_AUTHORITY
を設定すると manager-core
が壊れてしまいますので、この環境変数を設定する必要がある場合は manager
と manager-core
の両方を使用することはできません。
manager-core
(Windows 2.0.246-beta から)manager
はまだインストールされていますが、デフォルトのシステム設定では manager-core
が設定されています。username
フィールドに保存され、失われることはありません。osxkeychain
ヘルパーを使います。
まず、対象となるホストの現在の認証情報をすべて削除します。 例:GitHubの場合、github.comの「Internet Passwords」を検索するか、gitcreds::gitcreds_list()
と oskeyring パッケージを使って削除します。 oskeyring パッケージを使って、トークンとパスワードをバックアップすることもできます。
次に、「一般的なアクセス」に使用するクレデンシャルを追加します。 これは、ユーザ名のないURLに使用されるクレデンシャルです。 このクレデンシャルのユーザ名は重要ではありませんが、“PersonalAccessToken”、“token”、“generic” などの説明的なものを選ぶとよいでしょう。
このユーザ名をデフォルトで使うように git を設定します。 例: “generic” を選んだ場合は、次のように実行します。
git config –global crendetial.username generic
その他のすべての認証情報を、適切なユーザ名で追加します。 これらのユーザ名は、あなたが使いたいリポジトリや操作のための URL に入れる必要があります。 (GitHub は、パスワードが PAT の場合は実際にはユーザ名を使用しません)。
最新のgitバージョン(少なくとも2.29.0)にアップデートして、現在はデフォルトとなっているmanager-core
ヘルパーを使うことをお勧めします。 もし manager-core
をgitとは別にインストールしたのであれば、それを削除することをお勧めします。 というのも、どのヘルパーを実際に使うのかという点で混乱が生じる可能性があるからです。
まず、対象となるホストの現在の認証情報をすべて削除します。 これは、‘Credential Manager’ や gitcreds::gitcreds_list()
で資格情報を探し、oskeyring パッケージで削除することができます。 トークンとパスワードをバックアップするために oskeyring パッケージを使用することもできます。
次に、「一般的なアクセス」に使用したい credential を追加します。 これは、ユーザ名のないURLに使用される credential です。 この credential のユーザ名は重要ではありませんが、“PersonalAccessToken”、“token”、“generic”などの説明的なものを選ぶとよいでしょう。
www.DeepL.com/Translator(無料版)で翻訳しました。
このユーザ名をデフォルトで使うように git を設定します。 例: “generic” を選択した場合、次のように実行します。
git config --global crendetial.username generic
その他のすべての認証情報を、適切なユーザ名で追加します。 これらのユーザ名は、あなたが使いたいリポジトリや操作のための URL に入れる必要があります。 (GitHub は、パスワードが PAT の場合は実際にはユーザ名を使用しません)。
単一の github.com credential と他のホスト (GitHub Enterprise ホストを含む) に対する複数の credential を管理する必要がある場合は、デフォルトの manager
ヘルパーを使用してデフォルトの GCM 権威の自動検出設定を回避することができます。
この場合は、任意のユーザ名で github.com のクレデンシャルを追加し、他のホストごとにデフォルトのユーザ名を設定したりそのホストへの URL にユーザ名を含めたりすることができます。 以上が、ホストにデフォルトのユーザ名を設定する方法です。:
git config --global credential.https://example.com.username myusername
複数の github.com 認証情報を管理する必要がある場合は、manager
ヘルパーを使うことができますが、オプションや環境変数を設定して GCM 権限を変更する必要があります。 https://github.com/microsoft/Git-Credential-Manager-for-Windows/blob/master/Docs/Configuration.md#authority. を参照してください。 https://github.com/microsoft/Git-Credential-Manager-for-Windows/pull/891 がマージされれば、この作業は必要なくなります。 (少なくとも最近の git バージョンでは、この修正を加えた GCM ビルドが含まれています)。
このための設定の変更方法です。:
git config --global credential.authority Basic
また、github.comのみに変更することも可能です。:
git config --global credential.github.com.authority Basic
次に、デフォルトのユーザ名を設定します。このユーザ名は、ユーザ名のないURLに使用されます。:
git config --global credential.username generic
これで、認証情報を追加することができます。デフォルトの認証情報には “generic”ユーザ名を、その他の認証情報にはそれぞれのユーザ名とホスト名を追加します。