git push的时候没有权限

一、出现问题:git push的时候没有权限

最近在研究组件化方案的时候,按照大神的步骤一步一步来,过程中遇到了很多问题。当然这篇文章不是说组件化的,关于组件化的过程过几天再做个笔记,然后分享出来。

这里主要说一下 git 的 https 链接无法交互的问题,我在 coding (因为free,所以没用 github )上创建了私有 Repo 之后根本无法 push (私有 Repo 连 clone 都不行),因为大神给的 demo 在和远程仓库交互的时候用的是 https 链接,为什么我也用 https 链接就不可以呢?

后来尝试使用 ssh 链接,然后重新配置公钥上传到 coding.net 上,就解决了和远端仓库交互的问题。可是换回 https 链接之后就不可以了(因为 ssh 链接会报防火墙的警告,虽然没什么大影响,但是我有病,非想试试 https) 。

如果 Repo 的链接是 https 的话,我总会得到这个错误:

unable to access ' https://git.coding.net/xxxx/xxxx.git/ ': The requested URL returned error: 403

当然 https 肯定要输入用户名和密码的,它就是靠这个去校验的。我也想输入啊,可是系统不给我机会。后来随便在 github 上创建了公有库,让同事 clone 下来,然后 push,这个时候是需要他输入用户名和密码的。但是第一次输入密码后,就不会再提醒他再次输入了。显而易见是因为我的电脑缓存了我的 github 用户名和密码,所以才千万次的报403错误。

二 、理解 git 用户名密码缓存原理

为了方便 git 使用 https 方式传输代码的时候不用每次都输入用户名和密码,所以一般 git 会储存用户的用户名。 储存方式有缓存cache,保存在硬盘store,和保存在钥匙串osxkeychain中。

这篇文章翻译了git 关于 credentials 的介绍,里面详细说明了git 是如何寻找用户输入过的用户名和密码的,可以看一下明白 git 记录密码的原理。如果你不想看这篇文章,那么大概理解几个概念就好:

1. git 去找系统是否缓存了用户的密码有三种策略:去缓存中找,去磁盘中找,去钥匙串中找。

2. /Users/xxx/.gitconfig 文件中(这个文件如果没设置过git 的全局配置可能会不存在),配置了git 到底选择哪个策略去找用户名和密码。

3. 通过编辑 .gitconfig 文件,credential.helper = store/cache/osxkeychain 来修改 git 缓存策略。

理解了上面的概念后可以执行这个命令查看自己系统支持的crendential(凭证),

git help -a | grep credential

得到结果:

[图片上传失败...(image-fd0341-1539588801055)]

然后可以执行

git config --list

查看自己电脑的 git 的全局配置,可以看到credential.helper=(你自己电脑的配置)

如果你切换到 git 项目的文件夹里再使用 git config --list 可以看到对应项目的配置信息,红色是电脑的 global credential 配置,绿色的是当前 git 项目的 credential 配置(可以多个)

[图片上传失败...(image-85f238-1539588801055)]

三、解决问题

1. 清空配置

知道了这些之后,再解决这个问题就简单了,既然 git 是依靠credential.helper 配置去找用户名密码,那我直接不用这个配置不就会要求重新输入用户名和密码了吗? 打开 /Users/xxx/.gitconfig 文件,如果显示隐藏文件后还是找不到这个文件,那么可以使用以下任意的命令,成功后会在你的HOME路径下出现这个文件,

// 配置git 的缺省编辑器 例如:emacs
   $ git config --global core.editor emacs

//配置git 的用户名和邮箱
  $ git config --global user.name "xxxxxx"
  $ git config --global user.email "xxxx@.com"

执行这些命令后就能生成.gitconfig 配置文件,然后文本编辑器打开.gitconfig文件,清除里面的命令行生成的内容。

如果你的电脑本来就有.gitconfig文件, 找到下面这句话删除,保存退出。

[credential]   helper = xxx

这个时候输入命令

git config credential.helper

查看本机的credential 是否已经被清空。

如果输入了 git config credential.helper 命令之后还是出现了osxkeychain, store 或者 cache 等,说明 git 的配置还是没有被清空,我参考了stackOverFlow上这个问题 有人给了这样一个命令查看 credential.helper 所在的文件目录(可能一个电脑上有多个.gitconfig文件),

git config --show-origin --get credential.helper

file:/Applications/Xcode.app/Contents/Developer/usr/share/git-core/gitconfig    osxkeychain

如果你的Mac上还有Xcode的话,那么Xcode中还会有一个.gitconfig文件,找出他然后打开,清空[credential]。

再次输入

git config credential.helper 

如果没有任何反应,那么 credential 就是已经清空了,这个时候你无论在任何依托 git 的代码托管网站上 push 都会要求你输入用户名和密码了,而且每次都会要求你输入,是不是又有新的烦恼了呢?

2. 重新配置

理解了git 保存密码的原理,那我们可以按照自己的想法设置了,如上所述,可以设置成cache,store,keychain,这里我说下保存在磁盘中(store)和钥匙串中(keychain)两种方式。

  • 配置成store

命令

git  config --global  credential.helper  store 

或者 /Users/xxx/.gitconfig 打开.gitsonfig直接修改文件credential.helper=store

然后第一次push 的时候会提示输入用户名密码,输入完成之后/Users/xxx/ 文件夹下会生成一个新的文件.git-credentials,双击打开,里面保存了你的用户名密码等信息:

https://用户名:密码@网址

但是这种储存方式,在本地只会储存一个用户名和密码,例如我本地.git-credentials文件的内容是

https://用户名1:密码1@git.coding.net

那我如果想 push 到 github 上,又要重新输入用户名密码,你可以再次在 .git-credentials 文件中添加一个 url,格式是一样的,这次的用户名和密码改成你的 github 用户名和密码

https://用户名2:密码2@github.com

注意:如果在设置成global store之前/Users/xxx/ 文件夹中如果已经有了.git-credentials 文件,最好先删除,防止系统自动去那里寻找用户名密码。

  • 配置成osxkeychain

命令

git  config --global  credential.helper  osxkeychain

也或者/Users/xxx/.gitconfig 打开 .gitconfig 直接修改文件。

这个时候 git 是从你的钥匙串中访问储存的密码,同理如果第一次在钥匙串中没有找到用户名密码,则要求你输入,输入之后下次就不用再次输入啦。

与 store 方式不同的是(你的每个平台用户名和密码都不一样):
假如第一次 push 到 github,那么 keychain 记录了 github 的用户名密码,
第二次你想推送 coding,那么 keychain 没有 coding 的用户名密码,就会要求你再次输入。只是 store 的方式����� 我们需要手动添加 url,这里不用了。

我们可以查看 Mac 上的钥匙串,push 一次后就会新出先一个对应网站的钥匙串,你也可以双击访问,查看密码。

注意: 如果在/Users/xxx/ 文件夹中已经有了 .git-credentials 文件,要先删除,否则系统自动去那里寻找用户名密码。

这样就解决了git 缓存密码后所带来的问题。希望对你有所帮助!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容