◆

Mac 一直弹出 git credential osxkeychain 的解决

2023-02-02 01:370

macOS 上的 git 默认用 osxkeychain 这个凭据助手把 HTTPS 远程的账号密码存进系统钥匙串,第一次输入之后就不用再输。方便的前提是存进去的那份是对的;一旦钥匙串里缓存了一份过期或错误的凭据,git 每次都拿它去认证、每次都被服务端拒绝,于是就变成反复弹窗,而且我们手输正确密码也没用——因为弹窗提交的内容会再次和缓存里的冲突,或者压根没被采用。

最典型的触发原因是 GitHub 早就取消了 HTTPS 的账号密码认证,只接受 personal access token。我们钥匙串里存的还是几年前那个登录密码,服务端一律返回认证失败。所以修复思路是先清掉旧凭据,再用正确的 token 重新存一份;实在不想折腾就把这个助手关掉。

场景

不知道什么原因,拉取代码时一直弹出 git credential osxkeychain,并且输入的密码即使是对的也没有用

解决方法一

清空钥匙串里那条过期记录,让 git 下次拉取时重新走一遍完整的认证流程。

  • 打开 Finder / Applications 在搜索栏输入 Keychain Access,选择在 Application 中搜索
在 Finder 的应用程序目录中搜索钥匙串访问

这张图演示的是入口位置。搜索框旁边要把范围切成在"应用程序"里搜,否则默认范围搜不到这个系统自带工具。中文系统下它叫「钥匙串访问」,用 Spotlight(Command + 空格)敲这四个字更快。

  • 打开钥匙串
  • 删除 github.com 或者 gitee.com
钥匙串访问中搜索 github 找到对应的密码条目

这张图要看的是列表里那条名称为 github.com、种类是"互联网密码"的记录,它就是 osxkeychain 存进去的那份凭据。右键选删除即可。如果同一个域名出现多条(换过账号的话很常见),全部删掉,留一条错的就还会继续弹。

删除是不可恢复的,而且钥匙串里同时也存着浏览器保存的网站密码、Wi-Fi 密码等等,所以务必只删和 github.com / gitee.com 精确匹配的那几条,别按域名模糊搜出来一批直接全选删。删之前确认自己手上有可用的 token 或密码,否则删完就登不上了。

  • 再次拉取代码,重新输入账号密码

这里的"密码"对 GitHub 来说要填 personal access token,不是登录网站用的那个密码。token 在 GitHub 的 Settings → Developer settings → Personal access tokens 里生成,勾上 repo 权限。用户名照常填自己的账号名。

解决方法二

如果方法一清完之后还在弹,说明凭据助手本身的配置有问题——比如同一个 credential.helper 在多个配置文件里被设置了多次,git 会依次尝试每一个,其中某一个一直返回错误结果。这时得先搞清楚这个配置到底是从哪个文件来的。

git config --get-all --show-origin credential.helper

--get-all 会列出所有层级的取值而不是只显示最终生效的那一个,--show-origin 在每行前面标出该值来自哪个文件。两个参数配合起来才能定位问题。

git config 输出 credential.helper 的所有取值及其来源文件路径

这张图要看的是每行冒号前面那段 file:/xxx/gitconfig 的路径,它告诉我们这条配置写在哪。常见的几个位置:/usr/local/etc/gitconfig 或 /opt/homebrew/etc/gitconfig 是 Homebrew 装的 git 的系统级配置(Apple Silicon 机器在后者),/Users/<你>/.gitconfig 是我们自己的全局配置,仓库内的 .git/config 是仓库级。如果输出里 osxkeychain 出现了多次,就是它们在打架。

vi /usr/local/etc/gitconfig

路径要按上一步实际输出的来,别照抄。这个文件属于系统级配置,vi 打开时可能需要 sudo 才有写权限。改之前先备份一份:sudo cp /usr/local/etc/gitconfig /usr/local/etc/gitconfig.bak。

注释掉这一行 credential.helper=osxkeychain

git 配置文件用 # 或 ; 开头表示注释。注释掉之后 git 不再使用任何凭据助手,代价是每次拉取推送都要重新输入用户名和 token,所以这更像是一个排查手段或临时方案。

不想手动编辑文件的话,用命令达到同样效果更安全,能避免改坏语法:

# 只取消全局那一层
git config --global --unset-all credential.helper

# 取消系统级那一层(需要写权限)
sudo git config --system --unset-all credential.helper

更推荐的做法

把 osxkeychain 留着,只是让它存一份正确的凭据。这样既不用反复输 token,也没有弹窗。最简单的方式是直接往钥匙串里写:

git credential-osxkeychain store

回车后按提示逐行输入,输完再敲一个空行结束:

protocol=https
host=github.com
username=你的用户名
password=你的personal_access_token

写完用一次 git fetch 验证不再弹窗即可。另一个思路是干脆不用 HTTPS,把远程换成 SSH,认证靠密钥,钥匙串这条路完全绕开:

git remote set-url origin git@github.com:user/repo.git

改完 git remote -v 确认一下。SSH 和 HTTPS 拉到的代码与历史完全一致,随时能再切回来。

💬留言板0

还没有留言,来发表第一条吧~

PAGE LOAD / LIVEMac 一直弹出 git credential osxkeychain 的解决加载中