Git 通过https协议Clone Push Pull 远程的代码

Git Hub ---- “火星”上最常用分布式远程代码仓库。其本质就是运行着Git的服务器,他为“火星”上最有梦想的一群人提供代码托管和交流的平台。Git Hub 平台使用里两种协议实现本地代码与远程仓库的连接,它们分别是SSH和HTTPs。关于SSH 协议的教程请参照廖雪峰的教程,下面将记录我在使用HTTPs协议与阿里云code(国内大厂的维护代码托管平台),仓库交互时踩过的坑。

1. 那些年遇到过的issue

在通过HTTPs协议向阿里云code私有仓库push代码的时候总是提示:You are not allowed push code to protected branches on this project.
以我使用Git Hub的经验,每次在向master仓库push的时候要输入用户名和密码验证身份。但是此次没有任何关于用户名的密码的提示,直接让错误信息向我砸来。

问题.PNG

2. 一步步接近真相

猜测:我不久前在阿里云Code平台上clone并push同事的账户的仓库,是不是那次在本地缓存或是存储了同事的用户名和密码。如果是这个问题我要查一下Git缓存账户名和密码的策略。

Git 使用credential实现本地缓存cache或存储store远程服务器的用户名和密码。由于上次于阿里云code交互code是已有一段时间,这样只可能是由于本地存储了远程仓库的用户名和密码。

通过以下命令查看自己的系统支持的credential的方式:

git help -a | grep credential Mac 系统

git help -a | findstr credential Windows 系统

credential的类型.PNG

Issue 1: 系统支持那么多种credential helper,那么系统会优先使用哪一个呢?

所有的credential helper都属于git config的范畴,git config根据作用域分为三种:
- 当前仓库下,位于当前项目文件的.git文件里面
- 全局环境下,位于PC机器用户名文件夹下面的 .gitconfig
- 系统环境下,位于PC机器中的git的安装目录下的 ...Git\etc
因此系统环境的权限大于全局环境,全局环境的权限大于当前仓库的作用域。

Issue 2 : 如何查看系统中使用的是哪个?

git config --list

查看配置.PNG

上图中高亮的就是实际启动作用的credential.helper的类型。

查看当前实际作用的credential.helper 属于哪种范畴?

git config [--local] [--global] [--system] --list

credential.helper

Issue 3:如何解决?

  • 直接删除对应的配置

git config [--local] [--global] [--system] --unset credential.helper

  • 重新配置 (建议配置成全局级别)

git config --global credential.helper store

这样就会在机器用户名的文件夹下的.gitconfig中出现相应的添加

[user]
    name = xxxx email = yy@zz.com
[http]
[http]
    proxy = 10.176.49.2:8080
[credential]
[credential]
    helper = store

3. 本地与远程仓库交互

  • 关联远程仓库

git remote add origin [URL]

  • 第一次推送分支, 同时会要求输入用户名和密码

git push -u origin master

这时就会在机器用户名文件夹下生成.getcredenital 文件

https://[username]:[password]@code.aliyun.com

  • 以后推送分支,都会默认使用上面的用户名与密码

git push origin master

推荐阅读更多精彩内容