git credential
名称
git-credential - 检索并存储用户凭证
概要
git credential <fill|approve|reject>
描述
Git 有一个内部接口,用于存储和检索系统特定助手的凭证,并提示用户输入用户名和密码。git-credential 命令将此接口公开给可能想要以与 Git 相同的方式检索,存储或提示凭据的脚本。这个脚本化接口的设计模拟了内部 C API; 有关这些概念的更多背景信息,请参阅 Git 凭证 API。
git-credential(GIT-凭证)呈现命令行的“动作”选项(fill
,approve
或reject
之一),并读取在 stdin 凭证描述(参见 INPUT / OUTPUT FORMAT)。
如果动作是fill
,git-credential 将尝试通过读取配置文件,联系任何已配置的凭证助手,或通过提示用户来将“用户名”和“密码”属性添加到描述中。然后将凭证说明的用户名和密码属性与已提供的属性一起打印到 stdout。
如果动作是approve
,则 git-credential 将把描述发送给任何配置的凭证助手,这些凭证助手可以存储该凭证供以后使用。
如果操作是reject
,git-credential 将把描述发送给任何配置的凭证助手,这可能会擦除与描述匹配的任何存储的凭证。
如果动作是approve
或者reject
,则不应该发布输出。
典型的使用git credential(git 凭证)
使用 git-credential 的应用程序通常会使用git credential
以下步骤:
1. 根据上下文生成凭证描述。例如,如果我们需要一个密码https://example.com/foo.git
,我们可能会生成以下凭证描述(不要忘记最后一行的空行;它会告诉git credential
应用程序完成了它提供的所有信息): protocol=https host=example.com path=foo.git
2. 请求 git-credential 为我们提供用于此说明的用户名和密码。这是通过运行完成的git credential fill
,将步骤(1)中的描述反馈到其标准输入。标准输出将生成完整的凭证说明(包括凭证本身,即登录名和密码),如下所示:
protocol=https host=example.com username=bob password=secr3t
在大多数情况下,这意味着输入中给出的属性将在输出中重复,但Git也可能会修改凭证描述,例如,path
在协议为 HTTP(s) 且credential.useHttpPath
为 false 时删除该属性。
如果git credential
知道密码,在返回password=secr3t
之前,则此步骤可能没有涉及用户实际输入此密码(用户可能已输入密码来解锁钥匙串,或者,如果钥匙串已解锁,则没有用户交互)。
1. 使用凭证(例如,使用步骤(2)中的用户名和密码访问URL),并查看它是否被接受。
2. 报告密码的成功或失败。如果凭证允许操作成功完成,则可以使用“批准”操作标记该操作,以告知git credential
在其下一次调用中重用该操作。如果凭证在操作过程中被拒绝,请使用“拒绝”操作,以便git credential
在下次调用时要求输入新密码。在任何一种情况下,git credential
都应提供从步骤(2)获得的证书说明(其中也包含步骤(1)中提供的证书)。
输入/输出格式
git credential
在其标准输入/输出中读取和/或写入(取决于所使用的动作)证书信息。该信息可以对应于git credential
将获得登录/密码信息(例如主机,协议,路径)的密钥或者要获得的实际证书数据(登录/密码)。
凭证分为一组命名属性,每行一个属性。每个属性由键值对指定,由=
(等号)分隔,后跟换行符。密钥可能包含除=
换行符或 NUL 以外的任何字节。该值可能包含除换行符或 NUL 以外的任何字节。在这两种情况下,所有字节都按原样处理(即,没有引用,并且不能用新行或 NUL 传送值)。属性列表由空行或文件结束符终止。Git 了解以下属性:
protocol
证书将被使用的协议(例如,https
)。
host
网络凭证的远程主机名。
path
将使用凭证的路径。例如,对于访问远程 https 存储库,这将成为服务器上存储库的路径。
username
凭证的用户名,如果我们已经有一个(例如,来自用户的 URL 或先前运行的助手)。
password
证书的密码,如果我们要求它被存储。
url
当读取这个特殊的属性时git credential
,这个值被解析为一个 URL 并且被看作是它的组成部分被读取了(例如,它的url=https://example.com
行为就像是protocol=https
和host=example.com
被提供的一样)。这可以帮助呼叫者避免自己解析URL。请注意,URL 中缺少的任何组件(例如,上述示例中没有用户名)将被设置为空; 如果要提供 URL 并覆盖某些属性,请首先提供 URL 属性,然后再提供任何覆盖。