ssh -t git@github.com 返回 permission denied (publickey) 表明 ssh 认证失败,需依次检查:ssh-add -l 是否列出私钥、是否运行 eval "$(ssh-agent -s)"、私钥权限是否为 600、~/.ssh/config 中 identityfile 路径是否正确、公钥是否完整无误添加到 github。

这不是 Git 本身的问题,而是 SSH 认证失败或远程权限不足。你连不上服务器,或者连上了但没写权限——Git 只是把底层错误原样抛出来。
ssh -T git@github.com 返回 Permission denied (publickey)
说明密钥链断了,SSH 根本没认出你是谁。别急着重装 Git 或改 remote 地址,先跑这行命令验证:
ssh -T git@github.com
如果输出 Permission denied (publickey),按顺序检查以下几点:
-
ssh-add -l是否列出你的私钥?没输出就代表没加载成功 - 是否执行过
eval "$(ssh-agent -s)"启动 agent?Windows 用户注意:Git Bash、PowerShell、VS Code 内置终端三者互不共享 agent - 私钥文件权限是不是 600?运行
chmod 600 ~/.ssh/id_ed25519(别用id_ed25519.pub) -
~/.ssh/config里有没有写错IdentityFile路径?比如后缀误写成.pub,或用了$HOME变量(SSH 不解析) - 公钥内容是否完整复制?
cat ~/.ssh/id_ed25519.pub必须是一整行,开头是ssh-ed25519,结尾是你邮箱,不能有多余空格或换行
git push 报 remote: Permission to user/repo.git denied to xxx
恭喜,SSH 认证通过了,但你没仓库写权限。这类错误和密钥无关,别再反复配 key。
先确认当前 remote 地址:git remote get-url origin
然后对照排查:
- 如果是推到自己 fork 的仓库,但 remote 还指向上游(如
facebookresearch/detectron2),那就是地址设错了,该改成你自己的:git remote set-url origin git@github.com:yourname/detectron2.git - 如果是私有仓库,去 GitHub/GitLab 页面点 Settings → Collaborators / Members,确认你账号被授予
write或更高权限 - HTTPS 方式下,系统凭据可能缓存了旧账号:macOS 查 Keychain Access,Windows 打开 Credential Manager,删掉对应 host 的记录
子模块报 Permission denied (publickey),但主仓库正常
因为 .gitmodules 文件里硬编码了 SSH 地址,比如 url = git@github.com:org/subrepo.git。即使你用 HTTPS 克隆主仓,子模块仍会走 SSH。
抓取指定 GitHub用户的 Stars 项目,生成标准化中文 Markdown 报告。用户提及「分析 GitHub stars」「导出收藏项目」「汇总 GitHub 星标」「生成 stars 报告」或粘贴含 ?tab=stars 的链接时触发。执行通过 bash...
临时绕过(适合公开仓库):
运行这条命令强制所有子模块改用 HTTPS:
git config --global url."https://github.com/".insteadOf "git@github.com:"
长期方案必须配好 SSH,并确保子模块地址也匹配你的 ~/.ssh/config 中定义的 Host 别名。
注意:如果子模块是私有仓库,HTTPS 方式需配合 PAT(Personal Access Token),不能直接输密码。
npm install 报 git@github.com: Permission denied (publickey)
不是 npm 的问题,是某个依赖在 package.json 里写了 SSH 地址(比如 "libsignal-node": "git+ssh://git@github.com:signalapp/libsignal-node.git")。
快速定位方法:
- 看报错里出现的具体仓库路径,复制它,手动执行
git ls-remote git@github.com:xxx/yyy.git测试 - 若失败,说明该仓库的 SSH 认证没通——和主项目是否能 clone 无关,每个 SSH 地址都得单独认证
- 临时解决仍可用全局替换:
git config --global url."https://github.com/".insteadOf "ssh://git@github.com/"
最易被忽略的是:Windows 下不同终端的 ssh-agent 彼此隔离,你在 Git Bash 配好了,切到 VS Code 终端里照样报错;还有私钥权限不是 600 时,ssh-add 会静默失败,根本不会提醒你。










