首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
Mac终端Git账号密码设置与清除完全指南
📅 2026/9/17 0:10:45
✍️ 爱科研究院
👁 阅读 3,247
Mac 终端里 Git 突然要账号密码多半不是什么好兆头可能是你换了电脑可能是公司要求换 token也可能只是你密码输错太多次被缓存了。我在 Mac 上处理这类问题次数不少从 git push 弹出钥匙串窗口到明明删了凭据下次又自动登录踩过不少坑。这篇就把 Mac 终端里设置和清除 Git 账号密码这件事彻底讲清楚覆盖三种常见凭据存储方式、标准清除流程、清除后的重新登录配置以及多账号和几个高频报错的排查思路。适合刚接触 Git 的新手也适合被奇怪报错折磨的老手。1. Git 账号密码在 Mac 上的三种“藏身处”先弄清存在哪再谈怎么删不少人在终端里执行git config --global --unset credential.helper之后以为密码就删干净了结果下次 push 还是能直接通过。原因很简单你根本不知道 Git 把凭据放在哪里。Mac 上 Git 的账号密码存储机制主要有三种搞清楚它们后面的操作才是可控的。1.1 credential.helper 是什么决定 Git 把密码交给谁Git 本身不负责保存密码它只负责向一个叫“credential helper”的外部程序询问凭据。这个 helper 可以理解成 Git 的密码管家。你在~/.gitconfig里写的credential.helper osxkeychain就是在告诉 Git遇到需要认证的请求去找 macOS 的钥匙串要账号密码。常见的有三种 helperhelper 名称存储位置特点适用场景osxkeychainmacOS 钥匙串加密存储和系统登录钥匙串集成Mac 上的默认首选最安全store~/.git-credentials明文文件纯文本保存肉眼可读不推荐但很多脚本环境还在用cache内存默认缓存 15 分钟过期后重新询问想临时代管、不想落盘时用要注意的是这三者可以同时配置多个。git config --global --get-all credential.helper会把所有生效的 helper 都列出来。如果同时配了store和osxkeychainGit 会按顺序尝试这就解释了为什么你以为删掉了一个另一个还在默默把密码喂给 Git。另外git config本身分三档system级别的配置在/etc/gitconfigglobal级别在~/.gitconfiglocal级别在仓库目录的.git/config。低层级会覆盖高层级。清除的时候如果只动了globalsystem里的 helper 可能还在干活。1.2 钥匙串条目与 .git-credentials 明文文件的实际形态如果你用的是osxkeychain打开“钥匙串访问”App搜索github.com一般能看到一个“互联网密码”类型的条目名称是github.com“账户”那一列显示的是你的 GitHub 用户名。双击可以看到密码详情但默认是隐藏的需要输入登录钥匙串的密码才能查看。如果你用的是store打开终端执行cat ~/.git-credentials会看到类似这样的一行明文https://你的用户名:ghp_xxxxxxxxxxxxgithub.com注意这个文件里的“密码”很可能不是你登录 GitHub 的账号密码而是一个 Personal Access TokenPAT。GitHub 早在 2021 年 8 月就移除了 HTTPS 协议下的账号密码认证现在用 HTTPS 方式推代码必须用 token。很多人不知道这一点在提示输入密码时反复输入自己的登录密码结果一直被拒。至于cache它不落盘只存在内存里重启终端或过 15 分钟就没了。如果你只是临时不想每次输入密码可以考虑它但它不适合“长期记住密码”的需求。1.3 先确认你当前用的是哪种组合在执行任何清除操作之前先跑这两条命令确认现状git config --show-origin --get-all credential.helper git config --show-origin --get-all user.name git config --show-origin --get-all user.email--show-origin会告诉你每一项配置来自哪个文件。比如某次我排查一台 Mac发现credential.helperosxkeychain来自/etc/gitconfigsystem 级别而~/.gitconfig里根本没有配置。这意味着如果我只git config --global --unset credential.helper完全无效——因为配置根本不在 global 层。确认清楚“从哪个配置层级加载了哪个 helper、钥匙串里有没有条目、有没有 .git-credentials 文件”是后面能真正删干净的前提。这也直接影响你接下来应该走哪条清除路线。2. 清除密码的手把手操作终端命令、钥匙串访问和配置文件三路并进清除 Git 账号密码本质上要做两件事把 Git 配置里指向凭据存储的 helper 关掉或改掉同时把已经存在的凭据从对应存储介质里删掉。只做前者旧密码还在钥匙串里躺着只做后者Git 下次又会通过 helper 去问甚至可能在交互中把新密码自动存进去。2.1 查看和重置 credential.helper 配置先执行git config --global --get-all credential.helper如果有输出说明当前配置了 helper。要临时取消可以把对应的配置项删掉git config --global --unset-all credential.helper如果上面命令报错说没有这个配置项也不要慌接着用--show-origin查一下是不是配置在 system 或 local 层git config --show-origin --get-all credential.helper如果显示来源是/etc/gitconfig而你确实想彻底清除全局行为可以编辑系统级配置sudo git config --system --unset-all credential.helper但对于大多数个人电脑来说没有必要把系统级配置也删掉。更稳妥的做法是保留系统级 helper但确认它不是导致旧密码自动带出的元凶。如果你只是想“删掉当前这个账号的密码”第二步才是关键。2.2 用 security 命令清理钥匙串中的 Git 条目如果你的 git 使用osxkeychain真正的密码存在钥匙串里。终端操作比图形界面更快先查一下有哪些相关条目security find-internet-password -s github.com输出里会有一串字段重点看acct账户名和srvr服务名。如果确认要删除执行security delete-internet-password -s github.com这条命令会直接删除服务名为github.com的互联网密码条目不要求指定账户名但如果有多个账户混在同一个仓库平台上可能会全部删掉。更精准的删除方式是指定账户security delete-internet-password -s github.com -a 你的GitHub用户名同理如果你的远程仓库用的是 GitLab 或者自家 Git 服务器把服务名换成对应的域名比如security delete-internet-password -s gitlab.com -a 你的用户名 security delete-internet-password -s gitee.com -a 你的用户名这里需要提醒一下Git 连接自定义域名或 IP 的 Git 仓库时钥匙串里保存的服务名可能不是域名本身也可能是类似github.com的标准形式具体以security find-internet-password的结果为准。实测下来GitHub、GitLab 这类主流平台的服务名都很规律自建 Git 服务偶尔会出现多个同名条目删除前先 find 看清楚总没错。2.3 处理 .git-credentials 与 URL 内嵌凭据如果你之前使用过storehelper或者有人手动往~/.git-credentials里写过内容清理方式很简单rm ~/.git-credentials但记得先把文件内容确认一下cat ~/.git-credentials因为里面那个 token 可能还在其他地方有备份需求。删之前复制到密码管理器里保存是个好习惯。还有一个非常隐蔽的地方远程仓库 URL 内嵌凭据。执行git remote -v看一下git remote -v如果输出是origin https://你的用户名:ghp_xxxgithub.com/你的用户名/仓库名.git (fetch) origin https://你的用户名:ghp_xxxgithub.com/你的用户名/仓库名.git (push)说明凭据直接写在 URL 里了。这种情况下Credential helper 根本不参与Git 会直接从 URL 里取 token 认证。你删除钥匙串、删除配置统统没用只要 URL 里还有 tokenpush 就能成功或者报 401——取决于 token 是否有效。修正方法是把 remote URL 换成纯净形式git remote set-url origin https://github.com/你的用户名/仓库名.git清除 URL 内嵌凭据这一步很容易被忽略但恰恰是“清除后依然自动带出旧密码”的最常见原因之一。我帮同事排查过两个案例钥匙串和配置文件都清了最后发现 token 就明晃晃写在.git/config的 remote 里。2.4 清除后如何验证真的删干净了验证不能靠感觉给两个可重复的命令git config --global --get-all credential.helper security find-internet-password -s github.com第一条应该没有输出或者只剩你明确想保留的 helper。第二条如果找不到条目会返回 44 号错误The specified item could not be found in the keychain.这正是我们想要的结果。如果还想验证得更彻底可以随便挑一个远程仓库执行一次只读操作git ls-remote https://github.com/你的用户名/某个仓库.git正常情况下Git 会提示输入用户名和密码token这就说明旧凭据已经被真正清除认证流程回到了初始状态。如果它不提示、直接成功说明某个位置还有漏网之鱼回到前几节继续排查。3. 清除之后重新配置登录Token、SSH 与免密工作流密码清干净了接下来的问题自然就是下次我要 push总不能每次手输吧。重新配置的方式有很多种但选择哪一条决定了你以后在这台 Mac 上是“全程优雅”还是“天天输入验证码”。我个人的建议是要么用 HTTPS token 配合 osxkeychain要么直接切到 SSH两条都是 Mac 上的主流姿势。3.1 如果你只是先想临时换密码直接重新 push清除旧凭据后执行任意需要认证的操作比如git pushGit 会在终端里提示Username for https://github.com: 你的用户名 Password for https://你的用户名github.com:注意这里的 “Password” 不是你的 GitHub 登录密码而是 Personal Access Token。如果你输入登录密码大概率会得到remote: Support for password authentication was removed的提示。临时情况下输入一次 tokengit 就把凭据交给当前配置的 helper 处理了。如果此时 helper 已经被你删了下次又会重新询问。这正是很多人想要的“每次手动输入”效果适合安全性要求极高的机器。3.2 生成并配置 Personal Access Tokentoken 的生成路径在不同平台略有差异以 GitHub 为例进入 GitHub 网页 →Settings→Developer settings→Personal access tokens→Tokens (classic)→Generate new token (classic)。生成时勾选需要的权限repo私有仓库读写必选workflow如果仓库里有 GitHub Actions 工作流文件需要勾选gist操作 Gist 时需要delete_repo需要删除仓库时再勾选token 生成后只会完整显示一次页面刷新就再也看不到了。拿到之后立刻复制到密码管理器里然后就可以用它代替密码了。GitLab 和 Gitee 也有类似的 Personal Access Token 页面逻辑完全一致。区别主要是权限项名称略有不同比如 GitLab 里的read_repository、write_repository。自建 Git 服务如果开了 token 支持通常也会叫类似的名字。3.3 重新把新凭据交给 Git 记住如果你希望 Git 自动记住 token而不想每次手动粘贴重新设置 osxkeychain helper 是最好的方式git config --global credential.helper osxkeychain然后执行一次git push提示输入密码时把 token 粘贴进去。Git 会通过 osxkeychain 把凭据写入 macOS 钥匙串以后就不会再问了。下次推送时Git 从钥匙串里取出 token 完成认证全程无感。如果你是在一台不太信任的电脑上临时操作不想把 token 写进钥匙串可以用 cache 代替git config --global credential.helper cache --timeout3600这样 token 只在内存里保存 1 小时时间到了或者终端进程结束就自动失效。注意 cache 是按进程级别存在的新开一个终端窗口之前的缓存可能需要重新输入。3.4 更推荐的做法切到 SSH 通道HTTPS token 虽然能用但在 keychain 里管理的终归是第三方凭据。SSH 方式更清爽公私钥配对本地持有私钥远端只认公钥不需要维护 token 的过期时间。对于重视长期免密体验的开发者SSH 是 Mac 上的最优解。第一步生成密钥对。终端执行ssh-keygen -t ed25519 -C 你的邮箱example.com一路回车即可默认生成在~/.ssh/id_ed25519和~/.ssh/id_ed25519.pub。第二步把公钥添加到托管平台。复制公钥内容pbcopy ~/.ssh/id_ed25519.pub然后到 GitHub →Settings→SSH and GPG keys→New SSH key粘贴保存。GitLab、Gitee 类似。第三步测试连接ssh -T gitgithub.com如果看到Hi 你的用户名! Youve successfully authenticated, but GitHub does not provide shell access.就说明通了一半。但注意SSH 只对使用 SSH 协议的 remote URL 生效你还需要把仓库地址从 HTTPS 改成 SSHgit remote set-url origin gitgithub.com:你的用户名/仓库名.git之后 push 就不再需要任何账号密码或 token 了。SSH 和 HTTPS 两种方式可以同时存在但一个仓库的 remote 只能绑定一种协议想切换随时git remote set-url改回来。两种方案的对比对比维度HTTPS tokenSSH首次配置成本低生成 token 即可稍高需要生成密钥并配置远端公钥日常使用依赖钥匙串换机器要重新配置 token私钥跟着机器走换机器需要迁移密钥过期策略token 会过期需要重新生成公钥一般不过期除非手动删除安全边界token 泄露可单独吊销私钥泄露必须重新生成密钥对适合场景临时机器、多平台账号切换个人主力开发机、长期免密我在主力电脑上都是 SSH但在公用电脑上偶尔用 HTTPS token 应急两条路并行不冲突。4. 多账号和全局配置混用时的连锁反应很多人在清除 Git 账号密码时发现明明改了配置另一个仓库却还在用旧身份。其实不一定是清除没生效更可能是你的电脑上同时存在多个 Git 用户配置而你只清了一个。Mac 上的 Git 多账号问题比单账号的坑更多也更容易让人误判。4.1 user.name / user.email 的全局与仓库级覆盖git 提交时记录的作者信息取自user.name和user.email。这两个字段也有 system/global/local 三层优先级仓库级 local 配置会覆盖 global。也就是说你在全局配了 A 公司邮箱但某个仓库的.git/config里写了 B 个人邮箱这个仓库的提交就会显示 B 的身份。查看当前仓库实际生效的作者信息git config --local user.name git config --local user.email如果输出为空说明用的是全局值。修改某个仓库的单独身份git config --local user.name 你的名字 git config --local user.email 你的邮箱这个配置和清除密码本身是两件事但在多账号场景下容易被混为一谈。你可能以为“Git 还记着旧账号的密码”实际上 Git 只是用了错误的身份去向远端认证导致权限检查不通过表现和密码错误非常像。4.2 同一平台多账号如何在钥匙串里区分假如你同时使用两个 GitHub 账号都用 HTTPS osxkeychain钥匙串里会有两个github.com条目区别在acct字段。删除时要精确指定账户名否则会误删另一个账号的凭据。删除前先列出所有相关条目security find-internet-password -s github.com -g-g会在最后打印出密码本身隐私敏感慎用。推荐不看密码只列出条目security dump-keychain | grep -A 5 github.com找到目标账户名后再精准删除security delete-internet-password -s github.com -a 要删除的用户名说实话在同一平台用两个账号通过 HTTPS 认证是 Mac 上比较容易踩坑的场景。很多开发者最终都转投 SSH 了原因就是 SSH 可以通过 config 把不同的私钥映射给不同的 Host从根上隔离账号不需要在钥匙串里做心理博弈。4.3 通过 SSH Config 实现多账号并行SSH 多账号的核心思路给不同的远端地址起不同的别名每个别名用不同的私钥。编辑~/.ssh/config加入类似内容Host github-work HostName github.com User git IdentityFile ~/.ssh/id_ed25519_work IdentitiesOnly yes Host github-personal HostName github.com User git IdentityFile ~/.ssh/id_ed25519_personal IdentitiesOnly yes然后克隆或改 remote 时把地址里的github.com换成别名git remote set-url origin gitgithub-work:你的工作账号/仓库名.git git remote set-url origin gitgithub-personal:你的个人账号/仓库名.git这样两个账号同时存在于一台 Mac推送代码时各自使用对应的私钥互不干扰也完全绕开了钥匙串的凭据冲突。测试某个别名是否配置成功ssh -T gitgithub-work ssh -T gitgithub-personal终端会分别显示不同的 GitHub 用户名。这套方案多花三分钟配置但节省的是日后无数次的认证排错时间我觉得很值。5. 清除 Git 凭据时最容易踩的坑与排查链路写到这里基本操作已经齐了。但真实世界里你按照文章里的命令从头到尾走一遍八成还会遇到几个没预料到的情况。我把这些年帮别人和自己排查过的典型问题整理成几条排查链路遇到相似报错时可以直接对着查。5.1 清完还自动带出旧密码三层原因逐个排除现象执行了删除钥匙串、删了.git-credentialspush 的时候还是不提示输入密码直接成功或直接失败。说明旧凭据还在某个地方被 Git 读取到了按下面顺序排查。第一层看 remote URL 里有没有内嵌凭据git remote -v看到https://用户名:tokengithub.com/...这种格式先git remote set-url改干净。第二层看有没有其他配置层级的 helper 把凭据喂给 Gitgit config --show-origin --get-all credential.helper如果发现system层还有osxkeychain或store先确认是不是它的问题。钥匙串里的条目删干净了一般不会复活但.git-credentials文件可能会被某个 helper 自动重新生成。第三层检查是不是还有未删除的钥匙串条目。某些 Mac 上会有多个github.com条目分别对应不同账户删除时只删了一个另一个还在。用security find-internet-password -s github.com多执行几次看返回几个条目。有多个就逐个删。顺带提一个很实际的细节如果 Mac 上登录了多个 macOS 用户钥匙串也不是同一个。当前登录用户的钥匙串在~/Library/Keychains/login.keychain-dbGit 读取的是当前用户的钥匙串。如果你用 sudo 或者别的用户执行 Git 命令涉及的又是另一把钥匙串了。5.2 “could not read Username” 的完整排查现象清除凭据后执行git push终端输出类似fatal: could not read Username for https://github.com: terminal prompts disabled这个报错常发生在非交互式终端或 CI 脚本里。Git 想提示你输入用户名但发现当前没有可交互的终端于是直接放弃。常见的触发条件有在脚本、定时任务、后台进程里执行 git 命令stdin不是终端。环境变量GIT_TERMINAL_PROMPT0被显式设置禁止 Git 弹出交互式提示。GIT_ASKPASS指向了一个不存在或不可执行的程序。排查链路echo $GIT_TERMINAL_PROMPT echo $GIT_ASKPASS如果GIT_TERMINAL_PROMPT输出 0说明 Git 被明确禁止交互提示在交互式终端里也会报这个错。临时覆盖GIT_TERMINAL_PROMPT1 git push如果是GIT_ASKPASS指向了不存在的程序Git 也会失去提示能力。在交互式终端里直接unset GIT_ASKPASS再试。如果这些环境变量都是干净的还有一种可能你来 Mac 上用的是某个定制终端比如 Tabby 或 vscode 内置终端它们的 TTY 行为和系统自带终端不完全一致。实测中某些第三方终端的“交互提示”支持不完整Git 认为没有可用终端这时候换系统“终端”App 跑一下往往就出提示了。5.3 GitHub 密码认证被移除后的 403 处理现象输入了正确的登录密码但 push 被拒remote: Support for password authentication was removed on August 13, 2021. remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories for information on currently recommended modes of authentication. fatal: Authentication failed for https://github.com/...这其实不是“设置或清除 Git 账号密码”里的 bug而是 GitHub 已经彻底不让你用登录密码走 HTTPS 认证。遇到这个报错说明你输入的是密码不是 token。按第 3 节的方法生成 Personal Access Token然后重新 push输入用户名 token。如果你确定输入的是 token 还报 403大概率是 token 权限不够。检查 token 是否勾选了repo权限如果仓库启用了 SSO还需要在 token 页面点击 “Configure SSO” 并授权组织。这个坑在 corporate 环境里特别常见token 有权限但没做 SSO 授权Git 也会返回类似认证失败的错误。5.4 macOS 版本、Git 安装方式不同带来的补救差异Mac 上的 Git 来源五花八门系统自带的/usr/bin/gitXcode Command Line Tools 提供、Homebrew 安装的/opt/homebrew/bin/git或/usr/local/bin/git、官网 pkg 包、甚至某些 IDE 内置的 Git。不同来源的 Git对 osxkeychain 的支持情况不完全一致。先确认当前 Git 路径which git git --version如果你用的是系统路径下的 Git通常在安装 Command Line Tools 时会带上git-credential-osxkeychain。如果执行git config --global credential.helper osxkeychain之后Git 提示找不到git-credential-osxkeychain说明系统的 credential helper 缺失解决办法是安装 Homebrew 版的 Gitbrew install git安装后确认路径which gitHomebrew 版一般在这个路径下并且自带完整的 credential helper/opt/homebrew/opt/git/bin/git-credential-osxkeychain如果你的 Git 不是 Homebrew 安装的又不想换版本也可以手动把 helper 路径配给 Gitgit config --global credential.helper /usr/local/git/current/bin/git-credential-osxkeychain路径按实际安装位置调整。另外一个 macOS 相关的坑旧版本 macOS 上钥匙串行为可能会有差异尤其是 Catalina 和 Big Sur 之间的钥匙串迁移问题。如果在删除钥匙串条目后发现 Git 依然能从“系统钥匙串”取出凭据多半是条目被存到了 System keychain 而不是 login keychain。这时候用“钥匙串访问”App切换到“系统”钥匙串手动找到github.com条目删除。终端命令默认只操作当前用户钥匙串这是很多人删不掉旧密码的原因。还有个小细节如果你的 Mac 上装了多个版本的 Git终端里的git命令和 IDE 内置 Git 可能是不同版本导致同一个仓库在终端里要密码、在 IDE 里不用。排查时尽量统一使用同一个 Git 二进制或者在 IDE 的设置里把 Git 路径改成which git的结果。我在实际使用中养成的习惯是先把git config --show-origin --get-all credential.helper和git remote -v两条命令的输出看明白再决定动哪一层。很多“清不掉”的问题根本不是命令执行的问题而是没找到真正存凭据的位置。如果你是刚接触这块建议先在一台不太重要的测试仓库上把整套流程走一遍等熟悉了再处理主力仓库心态会稳很多。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/9/17 0:10:45
WorkBuddy Enterprise:企业级Agent协同工作流落地实践
2026/9/17 0:05:44
QMK 键盘矩阵图解析:ALF DC60 的 5×15 矩阵坐标与 60% 布局变体对照指南
2026/9/17 0:05:44
Omi Python SDK 实战指南:BLE 连接、Opus 解码与 Deepgram 实时转写的完整实现
2026/9/17 3:41:05
PUMA560正逆运动学MATLAB源码解析:从DH参数到轨迹规划闭环
2026/9/17 3:41:05
串口调试三剑客:MobaXterm、Bus Hound、SScom实战指南
2026/9/17 3:41:05
STM32多传感器环境闭环控制系统设计与实现
2026/9/17 3:41:05
使用 Terraform AWS Provider 构建 EventBridge → SNS 安全事件通知管道(CloudTrail API 实时告警实战)
2026/9/17 3:41:05
化合物半导体新增长:SiC与GaN的技术突破与产业落地
2026/9/17 3:36:05
Django个人主页部署实战:从配置到上线全流程避坑指南
2026/9/17 0:00:44
开学论文写作指南:核心框架梳理与高效完成技巧分享
2026/9/17 0:00:44
OpenMAIC:轻量级多Agent教学框架实战指南
2026/9/17 0:00:44
AWS无服务器应用开发指南:从Lambda到SAM的架构与实践
2026/9/16 18:36:59
拯救者Y7000黑屏故障排查与维修实战指南
2026/9/16 7:38:03
AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验
2026/9/16 1:54:57
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化