ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Mac 终端设置与清除 Git 账号密码:凭据助手机制与实操指南

Mac 终端设置与清除 Git 账号密码:凭据助手机制与实操指南 作为一个常年跟代码仓库打交道的开发者你一定碰到过这种情况换了新电脑、改了平台密码或者公司 GitLab 账号换了人终端里 push 代码时忽然开始一遍遍地要账号密码输错了还一直报 403。折腾半天发现是 Mac 钥匙串里旧凭据在作祟。“Mac 终端设置或清除 Git 账号和密码”这件事看起来网上零碎教程一堆但真能讲清楚原理、给全步骤的反而少见。这篇文章就把它一次说明白覆盖从首次设置、自动保存到彻底清除、换号更新的完整操作路径顺手把几个高频报错的排查方法也交代清楚。适合刚用 Mac 做开发的入门者也适合被 Git 凭据问题折磨过的老手。1. 技术背景Git 凭什么记住你的密码在动手敲命令之前先把底层机制讲明白。Git 本身并不保存密码它每次访问远程仓库时都会向远端发起认证请求。至于密码从哪来是弹窗输入、缓存自动给、还是直接读文件全靠一个叫 credential helper凭据助手的组件决定。1.1 凭据 helper 到底是个什么角色你可以把 credential helper 理解成一个“密码管家”。当 Git 需要认证时它先问管家“有没有这个仓库的账号密码”如果有直接取出来用如果没有再提示你输入。输入完成后要不要存、存到哪、存多久也是这个管家说了算。macOS 上最常见的是osxkeychain它背后调用的是系统自带的钥匙串Keychain服务。钥匙串加密存储、由系统统一管理安全性比明文文件高出不止一个档次。这也是为什么 Mac 上第一次 push 时弹出的“允许访问钥匙串”提示本质上就是在请求系统允许 Git 读写你的密码数据。1.2 四种常见存储方式的差异不同配置对应的行为差异很大我把市面上常用的几种列了个表方便直观对比方式配置值存储位置有效期限安全性钥匙串osxkeychainMac 钥匙串永久高系统加密内存缓存cache内存默认 15 分钟可自定义高不落盘明文文件store~/.git-credentials永久低明文存储不设置无不存储单次最高但频繁输入cache适合临时需要多次拉取推送、又不想把密码落盘的场景store适合服务器或者容器这类一次性环境在个人 Mac 上我不推荐。默认情况下安装了官方 Git for Mac 之后osxkeychain通常是默认启用的。但如果你用的 Git 版本比较旧或者装 Git 的方式比较特殊也可能没开启这就要手动配置。2. 设置账号从全局配置到持证上岗凭据助手解决的是“密码怎么存”的问题但 Git 提交代码时还要知道“你是谁”。这两件事经常被混在一起实际操作时是两步不能跳过任何一步。2.1 设置全局用户名和邮箱新环境第一次用 Git先确认自己的身份信息git config --global user.name 你的名字 git config --global user.email 你的邮箱这一步很基础但很关键。它对应的就是每次提交记录里显示的作者信息。如果你在公司和个人仓库间切换不建议全部用--global可以在具体仓库目录内去掉--global设置单独身份。查看当前配置是否生效git config --global --list如果你之前已经配置过这条命令会输出所有的全局配置项。检查 user.name 和 user.email 是否正确即可。2.2 开启 osxkeychain 自动保存确认身份信息后接下来就是开凭据保存。在 Mac 上先检查当前是否已经启用git config --global credential.helper如果输出为空说明没有配置任何凭据助手。直接启用系统钥匙串git config --global credential.helper osxkeychain配置完成后第一次执行git push或git pull时系统会弹窗询问“git-credential-osxkeychain 想要访问钥匙串中的钥匙”。点允许或者始终允许即可。之后 Git 就会把账号密码存入钥匙串下次不再提示。我遇到过一种情况明明执行了git config --global credential.helper osxkeychain但 push 时还是每次都询问密码。排查后发现是 Git 版本过旧不支持 osxkeychain helper。这时候需要升级 Git或者改用下面提到的 cache 方式临时过渡。2.3 使用 cache 临时缓存避免频繁输入有些场景下你不想把密码写入钥匙串比如使用公共电脑、临时处理一个仓库、不愿意在系统里留下凭据记录。这时用内存缓存更合适git config --global credential.helper cache --timeout3600--timeout3600表示缓存 1 小时单位是秒。3600 秒内 Git 会记住凭据超过后重新要求输入。这个时间的设定可以根据实际需要调整比如一天内频繁操作可以设成--timeout86400只是偶尔拉个代码300秒就够了。cache 模式的缺陷也很明显进程重启、系统重启、或者终端会话切换后缓存可能失效。它适合临时场景不适合长时间高频使用。2.4 使用 store 前的安全提醒store方式会把用户名密码以明文形式写入~/.git-credentials文件每行一个仓库地址。启用方式git config --global credential.helper store或者指定存储文件路径git config --global credential.helper store --file ~/.git-credentials这种方式的优点是配置简单、稳定可靠适合在远程服务器或 CI 环境中使用。但在个人电脑上我不建议长期开启。因为文件是明文任何能读取你 home 目录的程序或人都能直接看到你的密码。如果必须用建议把文件权限收紧chmod 600 ~/.git-credentials并且定期检查这个文件里有没有多余的账号信息。3. 清除与更新换账号、改密码不再抓狂凭据设置好之后接下来就是项目管理中更常见的场景换人、换平台、改密码之后怎么把旧凭据清掉。清理不干净轻则反复弹窗重则一直报权限错误折腾半天还以为是代码问题。3.1 查看当前凭据配置不管遇到什么凭据相关的问题第一步永远是先看当前状态git config --global --list | grep credential或者只看凭据助手git config --global credential.helper这会告诉你当前 Git 使用哪种方式保存凭据。如果配置了 osxkeychain说明凭据存在钥匙串里如果配置了 store说明存在~/.git-credentials文件里如果没有任何输出那说明 Git 正在每次询问账号密码。3.2 清除钥匙串里的 Git 凭据如果凭据存在钥匙串里清除方式有两条路图形界面和命令行。图形界面的操作路径比较直观打开“钥匙串访问”Keychain Access在右上角搜索框输入git或仓库的主机地址比如github.com。搜索结果里会看到类似github.com (你的用户名)的条目右键选择“删除”。删除后下次 Git 操作就会重新提示输入账号密码。命令行方式更适合批量处理或者不想离开终端的场景。先告诉 Git 你不需要当前保存的凭据git config --global --unset credential.helper但这条命令只是撤销配置不会删除已经存入钥匙串的数据。要真正删掉指定主机地址的凭据用以下方式git credential-osxkeychain erase EOF protocolhttps hostgithub.com EOF注意host要换成你的实际仓库主机地址。比如用的是 GitLab就写hostgitlab.com如果是公司自建的 Git 服务器要写公司服务器的域名或 IP。执行后没有任何输出表示清除成功。3.3 批量清除多个平台的凭据有些人的 Mac 里同时保存了 GitHub、GitLab、Gitee、公司内网等多个平台的凭据。逐个删除太费力可以写一个简单的循环脚本for host in github.com gitlab.com gitee.com; do git credential-osxkeychain erase EOF protocolhttps host$host EOF done这条命令会遍历列表中的主机地址把对应的钥匙串凭据全部清掉。如果想连 HTTPS 协议的也一起精准处理可以在协议行里指定git credential-osxkeychain erase EOF protocolhttps hostgithub.com username你的用户名 EOF带用户名进行清除会只删除该用户名对应的凭据不会误伤同主机下的其他账号。这在多账号并存的场景下非常实用。3.4 更新密码和切换账号的完整流程修改平台密码或者换绑账号之后只删除旧凭据还不够需要重新写入新凭据。完整流程如下清除旧凭据上面介绍的方法任选一种执行任意需要认证的操作比如git fetch或git push弹出输入框时输入新账号和新密码或 token如果开启了 osxkeychain输入后选择“始终允许”Git 会把新凭据存入钥匙串这样操作后新凭据会覆盖旧凭据。但如果钥匙串里残留了不止一个同名条目比如旧账号和新账号的主机地址一样、用户名不同就会反复弹窗。我建议先到钥匙串访问里搜索主机名把可疑的 Git 相关条目全部删掉统一清理后再重新认证一次到位。4. 常见失败案例与排查速查表凭据管理的问题大多是“看似配置正确实际上还报错”。下面几个场景是我在实际开发中遇到频率最高的整理成速查表供参考。4.1 push 时要求密码但怎么输都不对这是最典型的一类问题。Git 每次 push 都提示输入用户名密码输入后却报Authentication failed或403。绝大多数情况下只要你在远程仓库平台采用了 HTTPS 方式而平台的密码认证已经关闭平台要求使用 Personal Access Token个人访问令牌来操作仓库。即使你输入的密码完全正确认证也会失败。解决办法是登录平台的设置页面生成一个新的 Personal Access Token在终端提示输入密码时粘贴 token 而不是平台登录密码如果不想每次输入把 token 存入钥匙串git config --global credential.helper osxkeychain之后第一次认证时输入 token系统记录后就无需重复输入了。另外提醒一点有些平台的用户名也不是邮箱而是用户名 ID。比如 GitHub 上如果提示输入用户名优先填 GitHub 用户名而不是注册邮箱。填错了同样会认证失败。4.2 换账号后旧凭据一直生效你可能遇到过这种情况本地换了 Git 账号配置也改了但 push 代码时始终显示旧账号的提交记录或者权限错误一直报旧账号无权限。原因基本可以锁定为钥匙串里保存的还是旧凭据。清理方法参考上一节。这里我再补充一个隐蔽坑如果旧账号和新账号的主机地址完全一致钥匙串里可能同时存在两条凭据系统会优先使用最近写入的那一条。删除时请把搜出来的所有 git 相关条目全部清理不要只删一个。排查命令git config --global --get credential.helper git credential-osxkeychain get EOF protocolhttps hostgithub.com EOF第二条命令可以查询当前钥匙串里保存的用户名和密码会明文显示注意隐私确认是否还是旧账号。4.3 cache 超时与 sudo 副作用cache 模式配置后某些情况下还是会频繁要求密码常见原因有两个第一个是 timeout 设置过短或者 Git 每次在独立的 SSH 会话中执行导致 cache 不生效。这种情况在 IDE 内嵌终端、脚本自动化任务中最容易出现。解决方法是延长 timeout或者改用 osxkeychain。第二个坑和使用sudo有关。有些工程师拉取代码时报权限错误习惯性地在 git 命令前面加 sudo。这会切换成 root 用户去执行命令而 root 用户的 home 目录和当前用户的完全不一样意味着当前用户配置的 credential.helper、全局 user.name 全部失效。换句话说sudo git pull 时 Git 不知道你是谁凭据助手也没配置自然每次都要密码。正确的做法不是加 sudo而是修复仓库目录的属主sudo chown -R 你的用户名:staff /path/to/repo然后去掉 sudo 正常执行 git 命令。4.4 明文凭据泄露风险处理如果你之前用 store 方式保存过密码后来不再使用一定要记得手动清理。先查看文件内容cat ~/.git-credentials确认里面有哪些账号信息后按需编辑或直接删除文件rm ~/.git-credentials同时撤销 Git 配置git config --global --unset credential.helper这样处理后后续 Git 操作会重新要求认证。如果只是嫌明文存储不舒服但还想保留自动保存功能就把 helper 切换回 osxkeychain。5. 个人经验几个让我少走弯路的细节写完上面的配置和排查步骤再说几个平时不太容易注意到、但实际能省很多事的细节。第一修改完凭据后建议顺手执行git config --global --list确认配置。很多问题不是操作有问题而是配置没写进预期的位置。比如你当前在某个仓库目录里却没有加--global配置写进了.git/config只对当前仓库生效换一个仓库又打回原形。第二如果你在公司电脑上工作不要使用 store 方式保存 Git 密码。明文文件一旦被同步工具传到云端或者被其他程序读取账号信息就容易泄露。相比之下osxkeychain 虽然也会被系统其他进程访问但至少受限于系统权限机制。第三钥匙串访问里搜不到 git 条目时换个关键词再搜。有时候条目名称不是以 git 开头而是域名本身比如github.com或gitlab.company.com。直接在钥匙串访问的搜索框里输入主机名匹配到的条目更全。第四远程仓库地址从 HTTPS 切到 SSH 后原来的密码配置不会自动消失。如果你已经改用 SSH 方式连接旧凭据其实不会再影响日常操作但为了安全起见建议还是按上面的方式清理掉。第五如果你不确定当前 Git 版本是否支持 osxkeychain可以临时用 cache 模式兜底。等确认 Git 版本无问题后再切换到钥匙串方案。这个顺序能避免你在排查过程中反复卡在同一个报错上。Mac 上 Git 账号密码的设置和清除核心就是弄清楚凭据存在哪、用什么方式管理然后针对不同方式执行对应操作。钥匙串、cache、store 三者的取舍无非是在安全性、便捷性和适用场景之间找个平衡。希望这篇文章能把你在终端里踩过或将要踩的坑提前填平。
返回列表