背景介绍
刚进公司,使用公司的mac mini搭建本地开发环境,使用git从Gitlab仓库clone代码到本地,发现无法通过https协议的地址clone代码,始终提示remote: Repository not found.的错误。
|
|
首先,这个仓库是确实存在的,通过url可以再浏览器中直接访问到对应的Gitlab仓库页面。
再者,本地对git的配置也是没有问题的,通过SSH协议的地址是可以正常clone代码的。
|
|
并且,通过http协议的URL地址中加上git账号,也可以正常clone代码的。
那么问题出在哪里呢
问题分析
众所周知,Git(github、gitlab)仓库都要有两个地址,分别基于https(或者http)协议和SSH协议,两个协议对应的URL地址形式如下:
|
|
正常情况下,配置好本地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相关的其他知识,我还在学习中。😜