错误:仓库未找到。致命错误:无法从远程仓库读取。请确保您拥有正确的访问权限并且仓库存在。

7

昨天我创建了一个SSH密钥并克隆了一个与工作相关的仓库。在做了一些更改后,我尝试推送提交:

git push
ERROR: Repository not found.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

我已经阅读了这篇活跃的SO帖子。我的问题仍然存在。我不知道如何追踪问题,因此会分享我认为相关的所有内容。

在我的笔记本电脑上,我有个人和工作存储库。我的工作存储库位于~/Documents/Projects/Zen/Projects/下的任何目录中。其他任何地方,例如~/Documents/Projects/Personal/是用于个人github。

我的.gitconfig看起来像这样:

[user]
    email = 12345+doug@users.noreply.github.com
    name = 12345doug

[includeIf "gitdir:/home/doug/Documents/Projects/Zen/"]
    path = ~/.git-zen

/.git-zen看起来像这样:

[user]
        email = doug@work.com
        name = doug-work

目前我在一个仓库中:

pwd
/home/doug/Documents/Projects/Zen/Projects/analytics-psql-action

有一些准备好要推送的提交:

~/Documents/Projects/Zen/Projects/analytics-psql-action$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)

这个目录中我的git配置似乎是正确的:

git config user.name
doug-work

并且

git config user.email
doug@work.com

为了创建我的ssh密钥,我按照github.com上的这篇文章进行操作。
ssh-keygen -t rsa -b 4096 -C "doug@work.com"
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa

我随后根据此教程的指导,在我的工作github设置中添加了密钥。
目前为止,我认为我已经按照要求设置好了一切?但是当我尝试从这个仓库内推送时:
~/Documents/Projects/Zen/Projects/analytics-psql-action$ git push
ERROR: Repository not found.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

我绝望地将仓库重命名,并尝试从头克隆:

git clone git@github.com:work/analytics-psql-action.git # real path actually used not 'work'
Cloning into 'analytics-psql-action'...
ERROR: Repository not found.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights

在仓库本身上,如果我进入仓库设置 > 管理访问权限,我可以看到自己,doug-work拥有管理员访问权限。

我如何克隆并推送到仓库?我应该从哪里开始查找为什么我的ssh密钥设置不起作用?


我遇到了同样的问题:“ERROR: Repository not found.” 这是由于存储库是私有的所致。我不知道为什么在此处使用备用SSH身份会引起问题,也不知道如何解决它。 - Barton Chittenden
1
请查看 https://dev59.com/1Ijca4cB1Zd3GeqP0bKw#61150726;其中有一些关于将 user.email 与给定的 ssh IdentityFile 关联的策略。我还建议在 ~/.ssh/config 中为给定的 Host 条目添加 IdentitiesOnly=yes,这将防止 ssh 尝试其他身份验证。 - Barton Chittenden
3个回答

11
首先,提供一些背景信息:在您使用的URL中:
git clone git@github.com:...

这个问题中唯一重要的部分是git@github.com部分。你也可以这样拼写:
git clone ssh://git@github.com/...

使用完全相同的文本替换...,并具有完全相同的效果。

接下来,为了诊断问题,您需要从命令行运行ssh

ssh -T git@github.com

如果您的URL是 git@corp.com,您需要在此运行 ssh -T git@corp.com,以此类推。换句话说,我们取出 user@host 部分并执行 ssh -T user@host。这使得它适用于各种公司托管的变体,而不仅仅是GitHub。它还允许我们在GitHub上使用多个登录用户:请参见下面的更多内容。

现在,运行ssh -T git@github.com后,您可能会遇到权限被拒绝的错误,这意味着在github.com上尝试的所有密钥都未能成功,或者您可能会得到以下类型的输出:

Hi M! You've successfully authenticated, but but GitHub does not provide shell access.

现在,如果M有权限访问(读写)存储库,我们就可以读写这些存储库。但是也可能M只有读取权限,实际上是Q拥有写入权限。我们窃取了M和Q的密钥,但我们如何作为Q进入呢?

在我们深入探讨如何进行身份验证之前,让我们看看如果此类身份验证完全失败应该怎么做。我们的下一步是运行:

ssh -Tv git@github.com

这将产生大量输出,所有输出都以debug1为前缀。这里可能有一些线索指出了什么出错了。如果没有,我们可以使用ssh -Tvvssh -Tvvv来获得更多的调试输出,其前缀是debug2debug3。浏览所有这些输出时通常会出现以下问题:

  • 确保ssh正在查看正确的.ssh/*文件,其中存储了你的ssh密钥。
  • 确保ssh尝试其中的正确文件;
  • 确保它实际上可以读取这些文件。

如果不是,请查找与操作系统特定的方法以为ssh提供正确权限和路径。

使用多个身份

作为入侵MI-5档案的邪恶间谍,我们已经危及M和Q的秘密密钥,并现在希望插入我们的木马程序进入系统,以便我们可以为詹姆斯·邦德试图进行过度复杂的死亡做准备。 但那是以后的事情:现在我们正在以M的身份进入,但我们需要以Q的身份进入。我们该做什么?

为了以Q而不是M的身份进入GitHub,我们需要正确配置ssh。原因很简单:只列出我们.ssh目录中的所有密钥是行不通的。ssh会按某种顺序尝试它们,显然,我们的ssh首先尝试了我们的M密钥。一旦它起作用,就可以进入,ssh就停止尝试其他密钥。

我们需要让ssh首先尝试我们的Q密钥。我们可以删除我们的M密钥,但这很烦人:现在我们可以放置我们的木马程序,但我们无法找到只有M可以读取的邦德当前任务。我们想要的是有一种方法来选择我们将尝试的密钥

这就是.ssh/config文件发挥作用的地方:

Host as-q
    Hostname github.com
    User git
    IdentitiesOnly yes
    IdentityFile ~/.ssh/stolen-q-key

Host as-m
    Hostname github.com
    User git
    IdentitiesOnly yes
    IdentityFile ~/.ssh/stolen-m-key

现在我们可以将两个存储库列出为ssh://as-m/mi5/bond-assignments.gitssh://as-q/mi5/spy-devices.git,或者as-m:mi5/bond-assignments.gitas-q:mi5/spy-devices.git。(也就是说,在部分工作正常后,您需要更新与克隆相关联的URL。使用git remote set-url origin new-urlgit config --edit或您最喜欢的方式来实现这一点。)
当我们使用ssh as-q时,我们将使用github.com (Hostname)连接到ssh,并将git作为用户名并使用窃取的Q键作为密钥。当我们ssh as-m时,我们将连接到同一主机并使用相同的用户,但是这次使用窃取的M键。

我已经做了这一切,ssh可以工作,但Git-for-Windows仍然无法工作

您遇到了另一个问题:
  • 旧版本的Windows没有或者有一个不足的ssh。
  • 所以Git-for-Windows捆绑了一个ssh(就像它捆绑了一个bash版本:git-bash并不真正地是Git的一部分,它只是需要使用 Git,捆绑的ssh也不是Git的一部分,它只是需要使用 Git)。
  • 但是捆绑的ssh和系统ssh是不同版本的,它们使用不同的配置文件
如果系统ssh正常工作,请告诉Git使用系统ssh,例如:git config --global core.sshCommand ssh。如果不足,请使用捆绑的ssh(但是那么您上面的测试是如何工作的?)。

1
当我在工作仓库内运行ssh -T git@github.com时,会得到“Hi 12345doug!您已成功验证,但GitHub不提供shell访问权限。”看起来它正在使用我的个人git凭据而不是我的工作凭据doug-work。也许我的includeif设置有问题? - Doug Fir
1
更多信息。在工作库中,当我执行 git config user.name 命令时,我看到的是正确的工作用户名 doug-work,而不是个人用户名 12345doug - Doug Fir
终于搞定了。必须更新源并将 git@github.com 替换为所需的配置,例如上面的配置示例中的 as-mas-q。完整示例,假设源是 git@github.com:ourcompany/myrepo.git,则更改为 git remote set-url origin as-m:ourcompany/myrepo.git - Doug Fir
1
请注意,user.nameuser.email在身份验证过程中不会被使用。它们在更早的阶段使用,当您进行新提交时。是ssh URL中的主机名使ssh查看.ssh/config,而是.ssh/config控制ssh将发送哪个密钥。 - torek
在身份验证过程中使用了什么?我在那里看到了错误的用户名(而且它不是我 git 配置中的 user.name),我怀疑这就是问题所在 - 但是在哪里设置用于 SSH 的用户名呢? - undefined
显示剩余2条评论

2

如果您在添加SSH密钥后仍然遇到问题,请尝试以下方法。

git remote -v

这将显示远程SSH URL,然后执行以下命令:

git remote set-url origin "SSHURL"

将URL粘贴到上面的命令中,替换SSHURL即可。


1

在我的 Mac 上,我遇到了同样的问题。所以以下是我解决这个问题的方法:

步骤 1:

创建一个新的 SSH 密钥:

ssh-keygen -t ed25519 -C "your_email@example.com"

第二步:

将SSH密钥复制到剪贴板:

pbcopy < ~/.ssh/id_ed25519.pub 

第三步:

现在将复制的 SSH 密钥粘贴到相应的 Git 仓库中。

第四步: 在后台启动 SSH 代理。

$ eval "$(ssh-agent -s)"
> Agent pid 59566

第五步:现在尝试访问存储库

git clone git@github.com:username/repo-name.git

步骤6:

如果仍然看到问题,请检查ssh配置文件

vim ~/.ssh/config

内容应该是这样的

Host github.com
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519

步骤 7:

将您的 SSH 私钥添加到 ssh-agent,并将您的密码短语存储在密钥链中

ssh-add --apple-use-keychain ~/.ssh/id_ed25519

第八步:
现在再试一次,应该可以正常工作了。
git clone git@github.com:username/repo-name.git

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接