凭据助手
Gitcito 手里握着三种不同的机密,而人们很自然地以为它们是同一样东西:
| 由谁保管 | |
|---|---|
| 托管方 API 令牌——拉取请求(PR)、议题、CI 检查 | Gitcito,存在你的操作系统钥匙串里 |
git@… 传输 |
你的 SSH 密钥,经由系统的 ssh agent |
https:// 传输 |
git 自己的凭据助手 |
第三种在出问题之前谁也不觉得它算个功能,而一旦出问题,它就制造出 git 里最常见的两句 抱怨:它怎么又问我一遍? 和 它怎么还在发我已经撤销掉的那个令牌?
⌘K → 凭据助手。

你看到的是什么
每一条已配置的 credential.helper,连同它所在的作用域——system、global,然后是
本仓库。助手是叠加的:git 会依次询问每一个,仓库级的那条并不会替换掉全局的那条。
每一条都会对照你的机器做检查:
| 标记 | 含义 |
|---|---|
| 就绪 | 助手程序存在,能够运行 |
| 未安装 | 配置了,但程序不在——于是每次提示都退化成再手敲一遍密码 |
| 密码存在明文文件里 | store 助手(见下文) |
针对特定主机的规则列出的是 credential.<url>.* 小节。对它们匹配的 URL 而言,
这些规则压过普通设置,通常也就是「为什么偏偏这一个主机行为不一样」的答案。
选一个
| 助手 | 密码存到哪里 |
|---|---|
osxkeychain |
macOS 钥匙串——加密,按用户隔离 |
manager |
Git Credential Manager(Windows,跨平台) |
wincred |
Windows 凭据管理器 |
libsecret |
Linux 的 secret service(GNOME Keyring、KWallet) |
cache |
内存,保留 15 分钟。磁盘上什么都不留 |
store |
你主目录里的一个纯文本文件。未加密 |
Gitcito 只提供这台机器上确实装了的那些,标出与你的操作系统相配的那个,其余的置灰。
作用域很重要。 对所有仓库会写进你的全局配置,这几乎总是你想要的;仅对本仓库 是留给那种要向别的东西做认证的特殊仓库的。
store 助手与 ~/.git-credentials
store 会把 https://user:password@host 这样的行写进 ~/.git-credentials,纯文本,
没有任何形式的加密。任何以你的身份运行的东西都能读它:一个脚本、某个依赖的
postinstall,什么都行。
如果那个文件存在,本页会告诉你,并数出里面有多少条。它永远不会把内容显示出来——计数 本身就是重点,为了展示而去读内容会犯同一个错误。
如果你发现了一个,而这并非你本意:在这里挑一个真正的助手,然后删掉那个文件,重新认证 一次。
忘掉一条已存的凭据
当一个令牌被撤销或轮换之后,助手还在一遍遍递上旧的那个,于是每次推送都失败于一个什么
都没说清的 401。忘记会请求已配置的助手抹掉它为该主机保存的条目——也就是
git credential reject,git 自己文档里给出的路子。
这条路上什么都不会被读取:Gitcito 从不调用 git credential fill,那条命令会把一个
有效的密码打印到标准输出。
下一次推送会问你一次,然后助手把新答案存起来。
值得知道的限制
- 这是 git 的存储,不是 Gitcito 的。 改动它也会改变你终端里的行为——这正是重点, 但在动手之前值得知道。
- 系统级的助手只展示,不可编辑。 它们待在只有管理员才能写的配置里。
- Gitcito 无法列出一个助手都存了些什么。 没有哪个凭据 API 能在不交出机密的前提下 做到这一点,所以这个对话框只报告配置、并按你的要求执行擦除,别的什么都不做。
- 你交给 Gitcito 的令牌是另一回事。 撤销其中一个并不会碰到另一个;钥匙串那一侧 见安全。