## 名称

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 属性，然后再提供任何覆盖。