git 详解-问题篇
git 详解-问题篇
平常找开源代码时,浏览 github 必不可少可选项,偶尔出现无法访问,本篇文章简单讲解如何恢复。某些时候需要团队协作,明明有代码访问权限,但却无法下载代码。提交代码时失败,提示仓库不存在。别急,跟随博主文章指引一一修复。
作者:炭烤毛蛋 ,点击博主了解更多。
文章目录
- git 详解-问题篇
- 1. 无法浏览 github
- 1.1 检查 dns
- 1.2 解决方法
- 2. 已有代码无法下载
- 方案一:更新系统凭据管理器(最快,大概率解决)
- 方案二:重新生成一个新的 Token(如果忘记了或过期了)
- 方案三:直接在远程地址中嵌入 Token(永久解决,但需注意保密)
- 方案四:彻底弃用 HTTPS,改用 SSH(推荐长期方案)
- 3. 上载代码提示:无此仓库
- 3.1 请按照顺序操作排查原因
- 第一步:检查远程仓库地址(最可能的原因)
- 第二步:验证仓库是否真的存在
- 第三步:检查认证权限(根据你的连接方式)
- 情况 A:你用的是 HTTPS 地址(以 `https://` 开头)
- 情况 B:你用的是 SSH 地址(以 `git@github.com` 开头)
- 第四步:检查是否是私有仓库权限问题
- 第五步:终极确认(手动重置)
- 3.2 缺少代码仓,那就新建代码仓
- 准备工作:安装并登录 GitHub CLI
- 核心命令:`gh repo create`
- 场景一:创建全新的远程仓库(并克隆到本地)
- 场景二:基于已有的本地项目创建(最常用)
- 场景三:创建带 README 和 .gitignore 的仓库
- 常用选项与参数汇总
- Tips
- 结语
1. 无法浏览 github
1.1 检查 dns
pinggithub.com PING github.com(127.0.0.1)56(84)bytes of data.64字节,来自 localhost(127.0.0.1):icmp_seq=1ttl=64时间=0.026毫秒原因分析:
域名解析返回错误解析。可以尝试手动修改映射IP,即可正常访问。
1.2 解决方法
Linux 解决方法:
sudovi/etc/hosts ff02::2 ip6-allrouters +183.14.133.170 github.com# 立即生效配置systemctl restart avahi-daemonWindows修改方法
notepad.exe C:\Windows\System32\drivers\etc\hosts +183.14.133.170 github.comTips:IP 可能会发生变化,可登陆网站查询ipaddress.com查询后再修改。
2. 已有代码无法下载
下载 github 自有仓库代码时提示认证失败。
remote: Invalid username or token. Password authentication is not supportedforGit operations. fatal: Authentication failedfor'https://github.com错误的核心原因很明确:GitHub(以及大多数主流Git平台)已于2021年8月后全面禁止使用“账号密码”进行HTTPS Git操作,必须使用“个人访问令牌(Personal Access Token,简称PAT)”或SSH密钥。
报错Invalid username or token说明:你输入了登录密码(被拒绝),或者你已有的令牌(Token)已过期/权限不足。
针对不同情况,这里有 4 种解决方案(请按顺序排查):
方案一:更新系统凭据管理器(最快,大概率解决)
如果你之前输入过密码,系统会缓存旧密码。即使你现在生成了Token,如果不更新缓存,它依然会发送旧密码导致报错。
- Windows:打开“控制面板” -> “用户账户” -> “凭据管理器” -> “Windows 凭据”。在“普通凭据”列表中找到
git:https://github.com,点击“编辑”,将“密码”框中的旧密码替换为你新生成的Token(注意:这里填Token,不是GitHub登录密码)。 - macOS:打开“钥匙串访问”,搜索
github.com,找到对应的互联网密码条目,双击修改密码为Token。 - Linux(或通用命令行):直接执行以下命令清除旧缓存,下次推送时会提示你重新输入:
gitconfig--global--unsetcredential.helper
方案二:重新生成一个新的 Token(如果忘记了或过期了)
如果之前没有Token,或者Token已过期,需要去GitHub官网重新生成。
- 登录 GitHub -> 点击右上角头像 ->Settings。
- 左侧最下方点击Developer settings->Personal access tokens->Tokens (classic)。
- 点击Generate new token (classic)。
- 关键设置:勾选
repo(完全控制私有仓库)以及workflow权限。如果操作公开仓库,至少勾选public_repo。 - 生成后立即复制该Token(形如
ghp_xxxxxxxxxxxx)。
使用时注意:
当Git弹出登录框问你用户名时,填你的GitHub用户名;问密码时,必须粘贴这个Token(不要填你的登录密码)。
方案三:直接在远程地址中嵌入 Token(永久解决,但需注意保密)
如果你不想每次输入,可以直接修改远程地址,将Token写入URL(注意:此操作会使Token明文保存在.git/config中,不建议在共享设备上使用):
gitremote set-url origin https://<你的用户名>:<你的Token>@github.com/<用户名>/<仓库名>.git例如:https://zhangsan:ghp_abc123@github.com/zhangsan/test.git
方案四:彻底弃用 HTTPS,改用 SSH(推荐长期方案)
如果你觉得Token太麻烦,建议切换为SSH密钥,一次配置永久免密。
- 生成SSH密钥(如果已有则跳过):
ssh-keygen -t ed25519 -C "your_email@example.com" - 将公钥(
id_ed25519.pub)内容添加到 GitHub -> Settings -> SSH and GPG keys。 - 修改本地仓库远程地址为SSH格式:
gitremote set-url origin git@github.com:<用户名>/<仓库名>.git
3. 上载代码提示:无此仓库
在维护开源项目时,首次提交代码会提示未找到仓库。
ERROR: Repository not found. fatal: Could notreadfrom remote repository. Pleasemakesure you have the correct access rights and the repository exists.错误是 Git 与 GitHub 交互时最经典的问题之一。别担心,按以下步骤逐一排查,通常 5 分钟内就能解决。
根本原因逃不出这四种情况:URL 写错了、没有权限(认证失败)、仓库不存在,或者大小写写错了。
3.1 请按照顺序操作排查原因
第一步:检查远程仓库地址(最可能的原因)
首先确认你本地关联的地址是否正确。
gitremote-v你会看到类似这样的输出:
origin https://github.com/用户名/仓库名.git (fetch) origin https://github.com/用户名/仓库名.git (push)重点关注以下三点:
- 用户名和仓库名是否拼写正确(GitHub 仓库名区分大小写,
MyRepo和myrepo是完全不同的两个仓库)。 - 是否以
.git结尾(通常 HTTPS 地址必须带.git,SSH 地址也必须带)。 - 如果是 HTTPS,是否包含个人令牌(如果你复制的是浏览器地址栏的网址,那是网页地址,不是 Git 地址)。
修正方法:如果地址错误,使用以下命令修正:
gitremote set-url origin 正确的仓库地址
第二步:验证仓库是否真的存在
在浏览器中退出登录 GitHub 账号(或者使用无痕/隐私模式),直接访问https://github.com/用户名/仓库名。
- 如果显示404,说明仓库不存在。你需要先在网页上创建好空仓库(注意不要勾选 README)。
- 如果能正常打开页面,说明仓库存在,问题出在权限上。
第三步:检查认证权限(根据你的连接方式)
情况 A:你用的是 HTTPS 地址(以https://开头)
GitHub 已于 2021 年禁用了密码登录,现在必须使用个人访问令牌 (Personal Access Token)。
检查方法:执行一次拉取或推送,看提示输入密码时,你是否输入了令牌(而不是你的 GitHub 登录密码)?
gitpush-uorigin main解决方案:
- 去 GitHub 右上角头像 ->Settings->Developer settings->Personal access tokens->Tokens (classic)。
- 生成一个新令牌,必须勾选
repo权限。 - 复制令牌(只显示一次)。
- 回到终端,推送时提示输入
Username输入你的 GitHub 用户名,提示输入Password时粘贴刚才复制的令牌(粘贴时屏幕不会显示任何字符,直接回车即可)。
如果想省去每次输入令牌的麻烦,可以缓存凭证:
gitconfig--globalcredential.helper cache或永久存储(请谨慎考虑安全性):
gitconfig--globalcredential.helper store
情况 B:你用的是 SSH 地址(以git@github.com开头)
检查 SSH 连接是否畅通:
ssh-Tgit@github.com如果返回
Hi 用户名! You've successfully authenticated...,说明 SSH 没问题,请检查仓库地址中的用户名是否写错(必须是git,而不是你的用户名,例如git@github.com:用户名/仓库名.git)。如果返回
Permission denied (publickey),说明你的公钥未添加到 GitHub,或者密钥不匹配。
解决方法:- 查看你的公钥:
cat ~/.ssh/id_rsa.pub(如果没有,用ssh-keygen -t rsa生成)。 - 复制公钥内容。
- 去 GitHub 右上角头像 ->Settings->SSH and GPG keys->New SSH Key,粘贴进去保存。
- 再次运行
ssh -T git@github.com测试。
- 查看你的公钥:
第四步:检查是否是私有仓库权限问题
如果你尝试克隆或推送的仓库是私有的,而你的账号(或令牌)没有访问权限:
- 确保你是仓库的Owner或Collaborator(协作者)。
- 如果你用的是组织(Organization)下的仓库,检查你是否属于该组织,并且组织是否授权了你的 SSH 密钥或令牌。
第五步:终极确认(手动重置)
如果你不确定到底是哪里错了,最快的办法是移除旧的远程地址,重新添加一个绝对正确的地址:
# 1. 删除原来的远程地址gitremote remove origin# 2. 去 GitHub 仓库页面,点击绿色的 "Code" 按钮# 3. 复制正确的地址(选 HTTPS 或 SSH)# 4. 重新添加gitremoteaddorigin 你复制的地址# 5. 重新尝试推送gitpush-uorigin main提示:总结排查清单
- 浏览器无痕模式下能打开该仓库页面(不是 404)
git remote -v显示的地址和浏览器里的 Code 地址完全一致(包含大小写)- HTTPS 用户使用了Token(令牌)而不是密码
- SSH 用户执行
ssh -T git@github.com返回了成功信息 - Token 或 SSH 密钥包含了
repo权限
3.2 缺少代码仓,那就新建代码仓
在 Linux 下使用git命令创建 GitHub 仓库,最直接、高效的方式是使用 GitHub 官方命令行工具GitHub CLI (gh)。
下面是在 Linux 系统中使用gh的操作流程。
准备工作:安装并登录 GitHub CLI
安装
gh
根据你的 Linux 发行版,使用对应的包管理器进行安装。- Debian/Ubuntu:
sudoaptupdatesudoaptinstallgh - Arch Linux:
sudopacman-Sgithub-cli - Fedora/RHEL:
sudodnfinstallgh - 其他发行版或手动安装,请参考 GitHub CLI 官方安装指南。
- Debian/Ubuntu:
登录认证
安装完成后,执行以下命令,并按照终端提示,在浏览器中完成授权登录。gh auth login
核心命令:gh repo create
gh repo create是创建仓库的核心命令,它非常灵活,可以适应多种场景。
场景一:创建全新的远程仓库(并克隆到本地)
这个命令会在 GitHub 上创建一个全新的空仓库,并将其自动克隆到当前目录下。
# 创建一个名为 my-new-project 的公开仓库,并克隆到本地gh repo create my-new-project--public--clone# 创建一个私有仓库gh repo create my-private-project--private--clonemy-new-project是你的仓库名称。- 如果不指定
--public或--private,命令会进入交互模式,引导你完成创建。 - 如果省略
OWNER/部分(如my-org/my-project),仓库默认创建在你的个人账户下。
场景二:基于已有的本地项目创建(最常用)
这是最实用的工作流,适合你已经在本地写好了代码,现在想把它推送到 GitHub。
# 进入你的项目目录cd/path/to/your/local-project# 执行命令,将当前目录(.)作为源,创建远程仓库并推送所有代码gh repo create my-project--private--source=.--push--source=.表示将当前目录作为本地仓库的源。--push会将本地的所有提交推送到新创建的远程仓库。- 如果省略仓库名称
my-project,gh会自动使用当前文件夹的名字作为仓库名。
场景三:创建带 README 和 .gitignore 的仓库
你可以一次性为仓库添加描述、开源许可证、.gitignore文件和README.md。
gh repo create my-awesome-app\--public\--description"我的第一个应用"\--licensemit\--gitignoreNode\--add-readme\--clone-d, --description:添加仓库描述。-l, --license:添加开源许可证,如mit,apache-2.0,gpl-3.0等。-g, --gitignore:根据语言或平台生成.gitignore文件,例如Node,Python,Go等。--add-readme:自动创建一个README.md文件。
常用选项与参数汇总
| 参数 | 说明 | 示例 |
|---|---|---|
--public/--private/--internal | 必选其一,设置仓库的可见性。 | --public |
-d, --description <string> | 为仓库添加描述。 | -d "我的项目" |
--add-readme | 自动添加一个README.md文件。 | --add-readme |
-g, --gitignore <string> | 根据模板添加.gitignore文件。 | -g Node |
-l, --license <string> | 添加开源许可证。 | -l mit |
-c, --clone | 创建后自动将仓库克隆到本地。 | --clone |
-s, --source <path> | 指定本地已有仓库的路径。 | --source . |
--push | 创建后,将本地提交推送到远程仓库。 | --push |
-p, --template <repository> | 基于一个模板仓库来创建新仓库。 | -p my-template-repo |
Tips
- 用户名不是邮箱:在Git登录提示中,Username请填你的GitHub ID,而不是注册邮箱。
- 区分 Classic 和 Fine-grained 令牌:如果你用的是新版 Fine-grained 令牌,请务必确保它授权了当前仓库所在的组织,并勾选了
Contents读写权限。 - 如果是在 Actions/CI 环境中报错:检查环境变量中的
GITHUB_TOKEN或PAT是否已过期,需在仓库 Settings -> Secrets 中更新。
如果以上方法都试过仍然报错,建议执行git config --system --unset credential.helper清除系统级缓存,重启终端后再试。
结语
不枉博主详细讲解,欢迎订阅博主–炭烤毛蛋 。
