git credential

优质
小牛编辑
132浏览
2023-12-01

名称

git-credential - 检索并存储用户凭证

概要

git credential <fill|approve|reject>

描述

Git 有一个内部接口,用于存储和检索系统特定助手的凭证,并提示用户输入用户名和密码。git-credential 命令将此接口公开给可能想要以与 Git 相同的方式检索,存储或提示凭据的脚本。这个脚本化接口的设计模拟了内部 C API; 有关这些概念的更多背景信息,请参阅 Git 凭证 API。

git-credential(GIT-凭证)呈现命令行的“动作”选项(fillapprovereject之一),并读取在 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=httpshost=example.com被提供的一样)。这可以帮助呼叫者避免自己解析URL。请注意,URL 中缺少的任何组件(例如,上述示例中没有用户名)将被设置为空; 如果要提供 URL 并覆盖某些属性,请首先提供 URL 属性,然后再提供任何覆盖。