ARTICLE DETAIL

资讯详情

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

Git 取消自动保存密钥:本地凭据删除与清理指南

Git 取消自动保存密钥:本地凭据删除与清理指南 如果你改完 Git 密码后推送仍然失败多半不是服务器的问题而是本地还缓存着旧凭据。大部分 Git 新手在初次配置时都会顺手执行一条git config --global credential.helper store从此 Git 自动保存密码之后推送再也不用输入。但这条命令带来的副作用常常被忽略旧密码、旧凭证、旧密钥全被悄悄记在某处等到需要删除本地密钥、清理.git-credentials文件的时候才发现根本不知道从哪下手。这篇内容就是围绕“取消自动保存密钥”这个场景写的我会从凭据存储机制讲起给出从查看、删除到验证的完整流程并分享几次实测中踩坑后的处置方法。1. 为什么非要手动删除Git密钥先搞清凭据是怎么存下来的1.1 credential.helper 到底帮你做了什么事Git 本身并不负责保存密码。你每次用 HTTPS 方式 push 或 pull 时Git 会把账号密码交给一个叫做“凭据助手”的外部程序处理这个程序统称credential.helper。它的任务很简单你输入一次密码后它按照规则保存下来下次 Git 需要认证时它直接把保存的凭据拿给 Git 用。常见的 helper 有四种store把用户名和密码明文写到~/.git-credentials文件。cache临时明文保存在内存里默认 15 分钟超时后重新询问。osxkeychainmacOS 系统钥匙串经过系统级加密保存。manager/manager-coreGit Credential ManagerWindows、macOS、Linux 都能用依赖系统级加密存储。很多教程喜欢让人用store因为配置最简单一行git config --global credential.helper store就行。但代价就是密码以纯文本形式躺在磁盘上。如果有人拿到.git-credentials等于直接拿到了你的密码或访问令牌。我在帮朋友处理笔记本丢失后的授权撤销时就遇到过因为.git-credentials里的 Personal Access Token 没有及时撤销被人用来拉取私有仓库的情况。提示不要在任何公共或共享电脑上使用store。即使配置了manager离开前也应该主动清理凭据。1.2 .git-credentials 文件里的明文密码为何危险默认情况下~/.git-credentials的内容长这样https://yourname:ghp_xxxxxgithub.com https://yourname:token123gitlab.example.com每一行对应一个远程主机包含用户名和密码或者访问令牌。只要文件权限没设好尤其是 Windows 上经常被忽略任何本地进程都能读到这个文件。更重要的是这个文件不会因为你在网页端改密码而自动更新。很多人的坑就在这里GitHub 上改了密码但本地文件里还是旧令牌于是推送一直在失败。搞清楚这个文件存在于哪个路径、内容结构是什么样的是删除密钥的第一步。1.3 “保存的密码”和“SSH密钥”不是同一个东西清理之前必须先分清两个概念。HTTPS 方式的凭据通常指账号密码或 Personal Access Token由credential.helper管理而 SSH 方式用的是~/.ssh/id_rsa之类的私钥文件通过 SSH 协议认证。两者存储位置完全不一样处理方式也不同。标题里的“删除密钥”如果你指的是删除 SSH 私钥那我建议先确认当前仓库用的是 HTTPS 还是 SSH。在仓库目录执行git remote -v如果地址以https://开头清理的重点就是.git-credentials和系统凭据如果地址以git开头那重点就是~/.ssh目录下的私钥和平台上的公钥。后面我会把两条线都讲清楚你只需要按实际情况选择对应段落操作。2. 动刀之前先排查Git到底把密码藏在哪了2.1 用 git config --list 查看 helper 配置在删除之前先看当前 Git 到底记住了什么。执行git config --list --show-origin | grep -i credential加上--show-origin很关键它能显示每一行配置来自哪个文件。如果输出里有credential.helperstore说明全局配置启用了 store如果是credential.helpermanager说明密码大概率在 Windows 凭据管理器或 macOS 钥匙串里。如果当前仓库有自己的独立配置还需要在仓库目录里再执行一次git config --local --list | grep -i credential因为credential.helper可以在 system、global、local 三个层面分别设置。只删全局配置仓库里的本地配置可能还在凭据照样会被保存。我见过的最难缠情况就是 global 里已经 unset 了仓库.git/config里还挂着一个helper store导致文件删了又生成。2.2 找出 .git-credentials 和 .gitconfig 的准确位置.git-credentials的路径取决于配置 helper 时有没有指定--file参数默认是~/.git-credentials。Linux/macOS 下直接执行ls -la ~/.git-credentials ~/.gitconfigWindows 下如果用 Git Bash同样执行ls -la ~/.git-credentials也可以在资源管理器地址栏输入%USERPROFILE%\.git-credentials查看。.gitconfig通常在用户目录下里面可能有一整段配置[credential] helper store这段配置不删即使手动删了.git-credentials下一次输入密码后 Git 又会重新创建文件。2.3 判断哪些仓库还在依赖缓存凭据这一步很容易忽略。仓库本身的.git/config里可能没有 credential 配置但 Git 在认证时依然会向 helper 索要凭据。如果你有多个平台账号~/.git-credentials里会有多行最好逐个确认哪些主机还需要这些凭据。我通常的做法是先看每个仓库的git remote -v列出远程域名再对照.git-credentials文件里的主机名把不打算继续授权的账号挑出来。清理时只删除对应的行保留还需要的避免影响其他项目。小技巧查看文件内容时如果只是想确认文件是否存在用ls -la就够了如果非要cat记得在截图或日志里打码不要暴露完整令牌。我在给别人讲操作时经常看到有人贴出完整 URL这跟把密码贴群里没什么区别。3. 删除动作清单取消helper、移除凭据文件、清空系统存储3.1 正确执行 git config --global --unset credential.helper这是整个清理流程的核心动作。先取消全局自动保存git config --global --unset credential.helper执行后没有提示就是成功。如果提示找不到对应配置项说明全局层根本没有设置过 helper问题可能出在 local 或 system 层。如果之前设置过多次建议用--unset-all确保全部清掉git config --global --unset-all credential.helper只想让当前仓库忘掉密码、不碰全局配置就在仓库目录里执行git config --unset credential.helper这里要注意--unset删除的只是配置项不会删除已经保存的凭据文件所以下一步必须手动清理文件。这也是为什么很多教程只给一条命令读者执行完依然发现密码还在的原因。3.2 删除 .git-credentials 和 .gitconfig 里的残留配置取消 helper 之后明文文件还在。直接删掉rm ~/.git-credentialsWindows 下如果删不掉可能是文件被 Git 进程占用先关闭所有命令行窗口和 IDE再删除。接着打开~/.gitconfig把[credential]段落中helper store那一行删除。注意保留段落但清空值是不可靠的最好直接删干净。如果之前自定义过文件路径比如配置过git config --global credential.helper store --file ~/my-credentials那就要删除~/my-credentials而不是默认路径。执行git config --global --get credential.helper先看清楚 helper 的完整参数再决定删除哪个文件。很多人就是在这里踩坑配置文件里看起来是 store但实际文件被重定向到了一个隐蔽位置。3.3 清理 Windows 凭据管理器与 macOS 钥匙串如果你以前配置过manager或osxkeychain光删.git-credentials没用密码还存在系统的加密存储里。Windows 上打开“控制面板 - 用户账户 - 凭据管理器 - Windows 凭据”找到git:https://github.com这一项展开后点“删除”。命令行方式更快cmdkey /list找到目标后执行cmdkey /delete:git:https://github.commacOS 上打开“钥匙串访问”搜索关键字git或对应域名删除匹配的条目。命令行可以这样security delete-generic-password -s github.com如果-s指定的服务名不对系统会提示找不到那就换个服务名再试。这一步经常被遗漏因为很多人误以为删除文件就等于清除密码但系统凭据管理器里的旧凭据照样会让 Git 用缓存认证导致验证时仍然能正常 push。3.4 SSH 私钥的删除与公钥解绑如果你用的是 SSH 方式需要删除本地 SSH 密钥。先从内存代理里清掉ssh-add -D然后删除私钥文件和公钥文件rm ~/.ssh/id_rsa ~/.ssh/id_rsa.pub但注意仅仅删公钥不够远程平台GitHub、GitLab 等的“SSH keys”列表里也要删掉对应公钥否则别人手里的私钥副本还能访问。如果之前配置过~/.ssh/config里的 Host 别名记得移除相关段落。删除后执行ssh -T gitgithub.com出现Permission denied (publickey)就代表本地已经无法用旧密钥连接了。这块操作在标题里容易被忽略但实际清密钥时十有八九会用到。4. 清完别急着走用三条命令验证密码不再自动填充4.1 一条命令实测 HTTPS 凭据是否残留清理完最怕的就是“当时看着干净下一回 push 又自动成功”。验证方法很简单。在任意仓库目录执行GIT_TERMINAL_PROMPT0 git fetch环境变量GIT_TERMINAL_PROMPT0会让 Git 在需要交互输入密码时直接失败而不是弹出提示。如果 fetch 成功说明某个 helper 里还留着有效凭据如果报错Authentication failed或terminal prompts disabled说明清理到位Git 不再自动使用缓存密码。我实测时更喜欢用不需要改动仓库的命令来验证在临时目录里git clone一个需要认证的仓库地址加上同样的环境变量。克隆成功说明凭据还在失败说明已经清干净。这样不会影响当前项目的任何状态。4.2 检查 helper 有没有删干净的几种情况一个常见问题明明执行了git config --global --unset credential.helper但git config --list里还能看到credential.helpermanager。这通常意味着 helper 配置在 system 层级而不是 global。用--show-origin查看来源然后对应执行git config --system --unset-all credential.helper另一情况是在仓库目录里执行git config --local --list发现本地仓库自己设置了 helper。Git 的配置生效顺序是 local 优先于 globalglobal 优先于 system。所以最稳妥的做法是三层都查一遍确保没有任何一层在偷偷保存密码。如果三个层面都显示没有 helper 了但 fetch 依然能成功还可以检查环境变量GIT_CONFIG_COUNT、GIT_CONFIG_KEY_0、GIT_CONFIG_VALUE_0以及 Git 安装目录下的etc/gitconfig。这些位置比较冷门但确实能覆盖全局配置。4.3 SSH 连接验证与系统凭据列表复查如果你清的是 SSH 密钥验证命令是ssh -T gitgithub.com返回Permission denied就是符合预期的。如果返回Hi username! Youve successfully authenticated说明删除的私钥没有生效或者 ssh-agent 里还缓存了另一把钥匙。可以再执行一次ssh-add -D并用ssh-add -L确认列表为空。Windows 下删除凭据后可以再执行cmdkey /list搜索git:前缀确认没有遗留条目。macOS 下再用security find-generic-password -s github.com测试找不到才是正常。做完这套验证基本可以确定机器上不再有自动填充的 Git 凭据了。5. 我在清理Git密钥时踩过的坑和最终建议5.1 只删文件不删 helper文件会“复活”我第一次处理这类问题时直接删了~/.git-credentials以为万事大吉。结果下一次拉取代码时输入新密码文件立刻又被创建。原因很简单credential.helperstore还在全局配置里Git 每次拿到新凭据都会重新写回文件。所以操作顺序必须是先取消 helper再删除文件。如果已经删了文件才发现 helper 还留着那就赶紧补上取消 helper 的命令然后再把文件删一次。不要相信“把文件内容清空”的做法只要 helper 还在文件依然会被重新写入。5.2 全局配置误伤其他人或其它平台在共用电脑上执行git config --global --unset credential.helper会把这台机器上所有仓库的自动保存都关闭。如果你只是想让某个私有仓库不再保存密码更稳妥的是只在那个仓库里执行 local 删除或者用更细粒度的方式只针对某个域名关闭 helper。例如我想让 GitHub 不存密码但公司 GitLab 仍然自动保存可以在仓库配置里写git config credential.https://github.com.helper 空字符串表示对这个地址不启用 helper。这个设置比全局 unset 精准得多但我建议没有明确需求的人直接用全局 unset简单不容易出错。5.3 企业电脑上别一刀切先考虑加密存储如果你是设备管理员或者在处理公司配发的电脑我并不建议一律删除凭据。更好的做法是把原本的明文store换成系统级加密存储比如 Windows 上用 Git Credential Managergit config --global credential.helper managermacOS 上则用git config --global credential.helper osxkeychain这样密码仍然能自动填充但至少不是明文保存在.git-credentials里。如果安全策略要求彻底不保存再按第三、四章的流程做完整清理。判断标准很简单这台机器上还会不会有其他人使用如果会删除密钥比加密存储更安全如果只有自己用加密存储的体验更好。5.4 更推荐的长期方案切换 SSH 密钥但做好口令与备份清理掉 HTTPS 凭据之后很多人会面临每次 push 都要输密码的麻烦。我的建议是干脆改用 SSH 方式但不要再生成无口令的私钥了。生成时加上-t ed25519并设置 passphrasessh-keygen -t ed25519 -C your_emailexample.com然后把公钥加到 Git 平台私钥留在本机配置好 ssh-agent 之后每次认证不再重复输口令。将来要撤销这台机器的访问权限只需要删除本地私钥和平台公钥过程比清理 credential helper 更直观。我在几台开发机上都是这么做的既避免了.git-credentials明文密码问题又不需要频繁输入账号密码。如果你只是临时清理一台旧机器回到第三、四章的清单一步一步来就行。最后提醒一句无论你最后采用哪种方案清理完以后记得用第四节的验证命令跑一遍。凭据这种东西留着的时候感觉不到删不干净才最麻烦。
返回列表