Git 授权校验失败之谜

背景介绍


刚进公司,使用公司的mac mini搭建本地开发环境,使用git从Gitlab仓库clone代码到本地,发现无法通过https协议的地址clone代码,始终提示remote: Repository not found.的错误。

1
2
3
4
git clone http://xxx.com/xxx/appBackend.git
Cloning into 'appBackend' ...
remote: Repository not found
fatal: repository 'http://xxx.com/xxx/appBackend.git' not found

首先,这个仓库是确实存在的,通过url可以再浏览器中直接访问到对应的Gitlab仓库页面。
再者,本地对git的配置也是没有问题的,通过SSH协议的地址是可以正常clone代码的。

1
2
3
4
git clone 'git@xxx.com/appBackend.git' ssh_test
Cloning into 'ssh_test'...
remote: Counting objects: 25272, done.
remote: Compressing objects: 100% (19777/19777), done.

并且,通过http协议的URL地址中加上git账号,也可以正常clone代码的。
那么问题出在哪里呢

问题分析


众所周知,Git(github、gitlab)仓库都要有两个地址,分别基于https(或者http)协议和SSH协议,两个协议对应的URL地址形式如下:

1
2
3
4
# HTTP OR HTTPS
http://xxx.com/xxx/appBackend.git
# SSH
git@xxx.com/appBackend.git

正常情况下,配置好本地git环境,采用任意一个url,都可以clone到代码。但是为什么我本地通过HTTP、HTTPS协议git clone 不到呢?
、、、、

通过Google 得知,产生remote: Repository not found.报错的原因主要有两个,一是仓库地址错误,二是权限校验不通过。显然,第一个原因可以直接排除。

将问题重新整理,有以下的疑点:

通过HTTPS协议的URL进行git clone 的时候系统没有提示输入密码

在HTTPS协议的URL地址中加上Gitlab用户名就可以正常clone,系统木有提示输入密码。

这就说明,在系统的某一个地方,应该保存了Gitlab 的账号密码,所以在未指定账号的时候,git clone 木有提示输入密码,而是直接读取那个保存好的账号信息;但是,那个保存好的Gitlab账号应该存在一定的问题,默认情况下去git clone 的时候 GitLab 校验不能通过,返回异常错误。

基于以上的推测,应该找到本地存储gitlab账号密码的地方。

通过查看Git官方文档,存储Git用户信息的地方有三个:

/etc/gitconfig:存储当前系统所有用户的git配置信息;

~/.gitconfig或~/.config/git/config:存储当前用户的git配置信息;

仓库的Git目录中的config文件(即repo/.git/config):存储当前仓库的git配置信息。

这三个配置项的优先级从上往下依次上升,即repo/.git/config会覆盖~/.gitconfig中的配置,~/.gitconfig会覆盖/etc/gitconfig中的配置。

找了一遍,这几个地方,都没有该文件,只有~/.gitconfig,不过在~/.gitconfig中并没有账号信息,额,扎心啊,老铁!!!!

经过一会的凌乱,突然想到,mac 的keychain机制,打开keychain,搜索git,果然出现了一窝git的账号密码。🙃😊

哈,🌲😔,居然gitlab.com 的有两条记录,一条是本人的,另一条则是,公司原先一位同事的。

公司原先的那位同事是没有权限访问这个私有仓库的,但是在Terminal中执行git clone命令时,系统优先读取那位同事的git账号,并用该账号发起校验请求,从而造成读取私有仓库校验失败的问题。至此,git clone 失败的迷雾解开。

总结


简单粗暴的删除了keychain中另一位同事的git账号,在次clone的时候没有任何问题。

虽然问题解决了,但是,git的https协议授权和ssh协议授权,两套完全独立的权限校验系统到底是怎么实现的呢?或者一台电脑上怎么实现同时存在多个git账号不冲突,而且能git clone 相应仓库的代码呢?这个就到这吧,git相关的其他知识,我还在学习中。😜

文章目录
  1. 1. 背景介绍
  2. 2. 问题分析
  3. 3. 总结
,