我的问题是我不能从GitLab中push或fetch。但是,我可以克隆(通过HTTP或SSH)。当我试图推的时候,我得到这个错误:

权限被拒绝(publickey)致命:无法从远程存储库读取

从我看过的所有线索来看,以下是我所做的:

在我的电脑上设置一个SSH密钥,并将公钥添加到GitLab 完成了用户名和电子邮件的config -global 通过SSH和HTTP克隆,以检查它是否能解决问题 执行ssh -T git@gitlab.com命令

如果您对如何解决我的问题有任何见解,我将不胜感激。


当前回答

我花了好几个小时才修好的。下面的方法对我很有效。

在终端上执行这些命令。

ssh-keygen -t rsa -C "<your email address>" -b 4096 -t ed25519

将生成的密钥重命名为:id_rsa和id_rsa。将生成的公钥添加到gitlab服务器。

然后将ssh密钥添加到ssh代理,如下所示。

启动ssh-agent Eval "$(ssh-agent -s)" 如果生成的密钥名称不同,请在下面的命令中替换id_rsa ssh-add ~ / . ssh / id_rsa

要测试连接,请使用此命令。

ssh -T git@<git lab server url>

要排除故障,请使用以下命令。

ssh -Tv git@<git lab server url>
ssh -vvv git@<git lab server url>

现在可以将项目克隆到本地环境。

其他回答

我也有同样的问题,我通过添加一个新的ssh密钥来解决它:

ssh-keygen -t ed25519 -C "email@example.com" 将您的公共SSH密钥复制到剪贴板(xclip -sel clip < ~/. SSH /id_ed25519. exe)。pub在我的情况下在Linux上) 在gitlab上,转到settings=>ssh keys,然后跳过新密钥

我的问题是我使用了一个具有sudo访问权限的非root用户。但即使是sudo git克隆…没有工作。解决方案是为项目创建文件夹,chown用户项目文件夹,然后运行克隆没有sudo。

步骤1: 在~/中添加了一个配置文件。Ssh /config文件,看起来像

   User git
   Hostname gitlab.com
   IdentityFile ~/.ssh/id_rsa_gitlab
   TCPKeepAlive yes
   IdentitiesOnly yes

步骤2:克隆没有sudo的git repo。 文档:https://gitlab.com/help/ssh/README working-with-non-default-ssh-key-pair-paths

**有时在~/中有配置。ssh/config,但是,IdentityFile路径错误。您可以像这样检查文件名ls ~/.ssh/。gitlab的文件通常是id_ed25519。因此正确的配置是IdentityFile ~/.ssh/id_ed25519

我的问题是,我在/etc/ssh/sshd_config下的SSH配置文件中将UsePAM从yes切换为no。有了UsePAM,一切都很完美。

我知道,我回答这个问题很晚,甚至StackOverflow确认我是否真的想回答。我回答是因为没有人真正描述了实际的问题,所以想分享。

最基本的

首先,了解这里的遥控器是什么。Remote是GitLab,而你的系统是本地的,所以当我们讨论远程源时,在你的git Remote -v输出中设置的URL就是你的远程URL。

的协议

基本上,Git的克隆/推/拉主要适用于两种不同的协议(也有其他协议)

HTTP协议 SSH协议

当你克隆一个repo(或更改远程URL)并使用HTTPs URL如https://gitlab.com/wizpanda/backend-app.git时,它使用第一种协议,即HTTP协议。

而如果你克隆了这个repo(或者改变了远程URL),并使用git@gitlab.com:wizpanda/backend-app.git这样的URL,那么它就会使用SSH协议。

HTTP协议

在这个协议中,每个远程操作,即克隆、推和拉,都使用简单的身份验证,即远程(在本例中为GitLab)的用户名和密码,这意味着对于每个操作,您必须输入您的用户名和密码,这可能很麻烦。

所以当你推/拉/克隆时,GitLab/GitHub用你的用户名和密码验证你,它允许你做操作。

如果你想尝试这样做,你可以通过运行命令git remote set-url origin < HTTP -git- URL >来切换到HTTP URL。

为了避免这种情况,可以使用SSH协议。

SSH协议

简单的SSH连接使用公私密钥对。因此,在您的情况下,GitLab无法对您进行身份验证,因为您使用SSH URL进行通信。现在,GitLab一定以某种方式了解你。为此,您必须创建一个公共-私有密钥对,并将公钥提供给GitLab。

现在当你用GitLab推/拉/克隆时,GIT(内部是SSH)将默认提供你的私钥给GitLab并确认你的身份,然后GitLab将允许你执行操作。

所以我不会重复默罕默德已经给出的步骤,我只是从理论上重复。

生成密钥对' SSH -keygen -t rsa -b 2048 -C "My Common SSH key " 默认情况下,生成的密钥对在~/中。SSH名为id_rsa。Pub(公钥)& id_rsa(私钥)。 您将把公钥存储到您的GitLab帐户(相同的密钥可以用于多个或任何服务器/帐户)。 当你克隆/推/拉时,GIT会提供你的私钥。 GitLab将私钥与公钥匹配,并允许您执行。

Tips

您应该始终创建一个至少2048字节的强rsa密钥。执行命令为ssh-keygen -t rsa -b 2048。

https://gitlab.com/help/ssh/README#generating-a-new-ssh-key-pair

一般认为

这两种方法都有各自的优点和缺点。在我输入上面的文本后,我去搜索了更多关于这个的信息,因为我从来没有读过关于这个的东西。

我找到了这个官方文档https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols,它讲述了更多关于这方面的内容。我在这里的观点是,通过阅读错误并对错误进行思考,你可以建立自己的理论或理解,然后可以匹配一些谷歌结果来解决问题:)