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

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

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

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

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


当前回答

我在Windows 10上使用Pageant作为SSH代理,除了向Windows添加一个环境变量(翻译自德语Windows 10,所以命名可能不同):

搜索“变量” 打开系统环境变量 单击底部的环境变量按钮 添加一个名为“GIT_SSH”的新密钥和值“C:\Program Files\PuTTY\plink.exe”,到顶部的“用户变量xxx”部分 做完了。

感谢Benjamin Bortels,来源:https://bortels.io/blog/git-in-vs-code-unter-windows-richtig-einstellen

其他回答

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

我是这样解决的。

使用此命令生成Windows密钥:

ssh-keygen -t rsa -C "your.email@example.com" -b 4096

但问题是,在运行这个命令后,它弹出了一行: 输入保存密钥的文件(/c/Users/xxx/.ssh/id_rsa): " 在这里,我只给文件名,因为我的密钥被保存在我的pwd,而不是在给定的位置。当我做“git克隆”时,它假设键位于“/c/Users/xxx/”。Ssh /id_rsa”的位置,但没有找到,因此抛出错误。

在密钥生成时,生成了2个文件,即“file1”和“file1.pub”。我将这两个文件重命名为

file1 -> id_rsa 

and

file1.pub -> id_rsa.pub

并将它们放在“/c/Users/xxx/.ssh/”的位置。

在我们的例子中,这不是用户/客户端的问题,而是Gitlab服务器端的问题。

我们在CentOS 7.1上运行本地Gitlab CE 12.9实例。

我们发现在服务器上,.ssh/authorized_keys文件没有正确更新。用户创建他们的SSH密钥(遵循Gitlab指南)并将其添加到Gitlab服务器,但服务器不更新authorized_keys,因此总是会导致权限拒绝错误。

一个解决方法是通过运行以下命令重建authorized_keys文件:

$ sudo gitlab-rake gitlab:shell:setup

这适用于任何在运行rake任务之前添加密钥的人。对于下一个要添加密钥的用户,必须有人再次手动运行rake任务。

一个更持久的解决方案是不使用authorized_keys文件,而是在Gitlab数据库上使用索引查找:

GitLab Shell provides a way to authorize SSH users via a fast, indexed lookup to the GitLab database. GitLab Shell uses the fingerprint of the SSH key to check whether the user is authorized to access GitLab. Add the following to your sshd_config file. This is usually located at /etc/ssh/sshd_config, but it will be /assets/sshd_config if you're using Omnibus Docker: Match User git # Apply the AuthorizedKeysCommands to the git user only AuthorizedKeysCommand /opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell-authorized-keys-check git %u %k AuthorizedKeysCommandUser git Match all # End match, settings apply to all users again Reload OpenSSH: # Debian or Ubuntu installations sudo service ssh reload # CentOS installations sudo service sshd reload Confirm that SSH is working by removing your user's SSH key in the UI, adding a new one, and attempting to pull a repo.

默认情况下(我们安装时的默认情况),在Admin Area > Performance Optimization设置中检查了Write to authorized_keys文件。因此,我们未选中该选项,转而使用Gitlab数据库。

在设置了索引查找并取消对Write to authorized_keys文件的检查之后,SSH访问就可以了。

我知道,我回答这个问题很晚,甚至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,它讲述了更多关于这方面的内容。我在这里的观点是,通过阅读错误并对错误进行思考,你可以建立自己的理论或理解,然后可以匹配一些谷歌结果来解决问题:)

如何在ubuntu中添加SSH密钥到gitlab帐户?

在项目目录中打开终端。 输入' ssh-keygen -o -t rsa -b 4096 -C "your gitlab email" ',然后按enter键 输入“vim /home/mnbtech/.ssh/id_rsa”。Pub '然后按回车键 (或者手动打开你的'id_rsa. exe '。Pub '从你保存它的地方) SSH密钥将出现。复制这些 转到你的gitlab账户。 单击头像,单击“设置” 在左侧选择SSH-Keys 然后粘贴这些键 点击添加键

SSH-Key将被添加!

(注意,如果您有生成预览SSH密钥和获得拒绝权限(公钥)。您删除您的预览ssh密钥,并生成一个新的,并在您的终端上添加git用户名和电子邮件)