根本原因是HTTPS协议下平台已禁用明文密码,必须改用SSH协议或Personal Access Token配合凭证缓存;SSH需生成密钥并添加公钥,HTTPS下须用Token替代密码,Windows推荐manager-core自动管理。

Git 拉取代码频繁要求输入密码,本质是当前仓库使用 HTTPS 协议 + 账号密码认证,而平台已禁用明文密码登录(如 GitHub 自 2021 年 8 月起全面停用),你输的其实是失效的密码或没权限的账号。真正有效的免密方案只有两个:换 SSH 协议,或正确配置凭证缓存(且必须配合 Personal Access Token 使用)。
为什么 git config --global credential.helper store 有时无效
这条命令本身没错,但容易踩三个坑:
- 你仍在用 HTTPS 地址(
https://github.com/user/repo.git),而平台已拒绝普通密码,必须改用token代替密码——输错 token 或过期 token 会导致反复提示,不是配置没生效 - 执行完
git config --global credential.helper store后,没再触发一次git pull,所以没机会把凭证写入~/.git-credentials - Linux/macOS 下该文件权限若为 644 以上,Git 会主动忽略它(出于安全考虑),需手动运行
chmod 600 ~/.git-credentials
如何确认并切换到 SSH 协议(推荐长期方案)
先看当前远程地址类型:
git remote -v
如果输出含 https://,说明走的是 HTTPS;若含 git@xxx.com:,才是 SSH。切换步骤如下:
|Git删除了文件,但还会在Git 仓库历史中遗留。 - 想要从 Git 历史移除敏感信息(密码、密钥、token、私钥) - 想要删除意外提交的大文件 - 想要重写 Git 历史、移除特定文件的所有痕迹 - 提到 "force push"、"重写 commit 历史" - 需要从所有分支、所有 tag 中删除某个文件
- 生成密钥(若无):
ssh-keygen -t ed25519 -C "you@example.com",一路回车,不设 passphrase(或后续用ssh-agent管理) - 复制公钥:
cat ~/.ssh/id_ed25519.pub,整行复制(含ssh-ed25519开头) - 粘贴到 GitHub/Gitee/GitLab 的 SSH Keys 设置页(不是 Password 或 API Tokens)
- 修改远程地址:
git remote set-url origin git@github.com:username/repo.git - 测试连通:
ssh -T git@github.com,看到Hi username! You've successfully authenticated才算成功
HTTPS 场景下必须用 Personal Access Token 替代密码
GitHub、GitLab、Gitee 等平台已不再接受账户密码用于 Git 操作。你必须用 Token:
- GitHub:Settings → Developer settings → Personal access tokens → Tokens (classic) → Generate new token(勾选
repo权限) - Gitee:右上头像 → 设置 → 私人令牌 → 创建新令牌(选择
projects权限) - 生成后,下次
git pull提示输密码时,**用户名填你的账号,密码栏粘贴 Token 字符串**(不是密码!) - 此时
credential.helper store才能存下有效凭证;否则存的是一串被拒的密码,下次照样弹窗
Windows 用户优先用 git config --global credential.helper manager-core
Git for Windows 自带的 manager-core(非旧版 manager)支持浏览器 OAuth 登录,自动处理 Token 刷新,比手动存 token 更省心:
- 执行:
git config --global credential.helper manager-core - 首次
git pull会弹出浏览器窗口,用 GitHub/Gitee 账号扫码或登录即可 - 后续所有操作自动携带有效凭证,Token 过期时会静默刷新,不用人工干预
- 注意:别混用
store和manager-core,冲突时删掉~/.git-credentials并重置 helper
最常被忽略的一点:SSH 方式下,如果私钥设置了 passphrase,每次操作仍会弹窗。这不是“没免密”,而是密钥本身被加密了——要么删 passphrase(ssh-keygen -p -f ~/.ssh/id_ed25519),要么用 ssh-agent 加载一次,否则无法真正一劳永逸。










