Git 通过https协议Clone Push Pull 远程的
Git Hub ---- “火星”上最常用分布式远程代码仓库。其本质就是运行着Git的服务器,他为“火星”上最有梦想的一群人提供代码托管和交流的平台。Git Hub 平台使用里两种协议实现本地代码与远程仓库的连接,它们分别是SSH和HTTPs。关于SSH 协议的教程请参照廖雪峰的教程,下面将记录我在使用HTTPs协议与阿里云code(国内大厂的维护代码托管平台),仓库交互时踩过的坑。
1. 那些年遇到过的issue
问题.PNG在通过HTTPs协议向阿里云code私有仓库push代码的时候总是提示:You are not allowed push code to protected branches on this project.
以我使用Git Hub的经验,每次在向master仓库push的时候要输入用户名和密码验证身份。但是此次没有任何关于用户名的密码的提示,直接让错误信息向我砸来。
2. 一步步接近真相
猜测:我不久前在阿里云Code平台上clone并push同事的账户的仓库,是不是那次在本地缓存或是存储了同事的用户名和密码。如果是这个问题我要查一下Git缓存账户名和密码的策略。
Git 使用credential实现本地缓存cache或存储store远程服务器的用户名和密码。由于上次于阿里云code交互code是已有一段时间,这样只可能是由于本地存储了远程仓库的用户名和密码。
通过以下命令查看自己的系统支持的credential的方式:
git help -a | grep credential Mac 系统
credential的类型.PNGgit help -a | findstr credential Windows 系统
Issue 1: 系统支持那么多种credential helper,那么系统会优先使用哪一个呢?
所有的credential helper都属于git config的范畴,git config根据作用域分为三种:
- 当前仓库下,位于当前项目文件的.git文件里面
- 全局环境下,位于PC机器用户名文件夹下面的 .gitconfig
- 系统环境下,位于PC机器中的git的安装目录下的 ...Git\etc
因此系统环境的权限大于全局环境,全局环境的权限大于当前仓库的作用域。
Issue 2 : 如何查看系统中使用的是哪个?
查看配置.PNGgit config --list
上图中高亮的就是实际启动作用的credential.helper的类型。
查看当前实际作用的credential.helper 属于哪种范畴?
credential.helpergit config [--local] [--global] [--system] --list
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