推送到Git返回错误代码403致命:HTTP请求失败


634

我可以通过经过身份验证的HTTPS克隆此存储库的副本。我进行了一些提交,并希望将其推送回GitHub服务器。在Windows 7 x64上使用Cygwin。

C:\cygwin\home\XPherior\Code\lunch_call>git push
Password:
error: The requested URL returned error: 403 while accessing https://MichaelDrog
alis@github.com/derekerdmann/lunch_call.git/info/refs

fatal: HTTP request failed

还可以使用详细模式进行设置。我还是很困惑。

C:\cygwin\home\XPherior\Code\lunch_call>set GIT_CURL_VERBOSE=1

C:\cygwin\home\XPherior\Code\lunch_call>git push
Password:
* Couldn't find host github.com in the _netrc file; using defaults
* About to connect() to github.com port 443 (#0)
*   Trying 207.97.227.239... * 0x23cb740 is at send pipe head!
* Connected to github.com (207.97.227.239) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: C:\Program Files (x86)\Git/bin/curl-ca-bundle.crt
  CApath: none
* SSL connection using AES256-SHA
* Server certificate:
*        subject: 2.5.4.15=Private Organization; 1.3.6.1.4.1.311.60.2.1.3=US; 1.
3.6.1.4.1.311.60.2.1.2=California; serialNumber=C3268102; C=US; ST=California; L
=San Francisco; O=GitHub, Inc.; CN=github.com
*        start date: 2011-05-27 00:00:00 GMT
*        expire date: 2013-07-29 12:00:00 GMT
*        subjectAltName: github.com matched
*        issuer: C=US; O=DigiCert Inc; OU=www.digicert.com; CN=DigiCert High Ass
urance EV CA-1
*        SSL certificate verify ok.
> GET /derekerdmann/lunch_call.git/info/refs?service=git-receive-pack HTTP/1.1
User-Agent: git/1.7.4.3282.g844cb
Host: github.com
Accept: */*
Pragma: no-cache

< HTTP/1.1 401 Authorization Required
< Server: nginx/1.0.4
< Date: Thu, 15 Sep 2011 22:44:41 GMT
< Content-Type: text/plain
< Connection: keep-alive
< Content-Length: 55
< WWW-Authenticate: Basic realm="GitHub"
<
* Ignoring the response-body
* Expire cleared
* Connection #0 to host github.com left intact
* Issue another request to this URL: 'https://MichaelDrogalis@github.com/dereker
dmann/lunch_call.git/info/refs?service=git-receive-pack'
* Couldn't find host github.com in the _netrc file; using defaults
* Re-using existing connection! (#0) with host github.com
* Connected to github.com (207.97.227.239) port 443 (#0)
* 0x23cb740 is at send pipe head!
* Server auth using Basic with user 'MichaelDrogalis'
> GET /derekerdmann/lunch_call.git/info/refs?service=git-receive-pack HTTP/1.1
Authorization: Basic XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
User-Agent: git/1.7.4.3282.g844cb
Host: github.com
Accept: */*
Pragma: no-cache

< HTTP/1.1 401 Authorization Required
< Server: nginx/1.0.4
< Date: Thu, 15 Sep 2011 22:44:41 GMT
< Content-Type: text/plain
< Connection: keep-alive
< Content-Length: 55
* Authentication problem. Ignoring this.
< WWW-Authenticate: Basic realm="GitHub"
* The requested URL returned error: 401
* Closing connection #0
* Couldn't find host github.com in the _netrc file; using defaults
* About to connect() to github.com port 443 (#0)
*   Trying 207.97.227.239... * 0x23cb740 is at send pipe head!
* Connected to github.com (207.97.227.239) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: C:\Program Files (x86)\Git/bin/curl-ca-bundle.crt
  CApath: none
* SSL re-using session ID
* SSL connection using AES256-SHA
* old SSL session ID is stale, removing
* Server certificate:
*        subject: 2.5.4.15=Private Organization; 1.3.6.1.4.1.311.60.2.1.3=US; 1.
3.6.1.4.1.311.60.2.1.2=California; serialNumber=C3268102; C=US; ST=California; L
=San Francisco; O=GitHub, Inc.; CN=github.com
*        start date: 2011-05-27 00:00:00 GMT
*        expire date: 2013-07-29 12:00:00 GMT
*        subjectAltName: github.com matched
*        issuer: C=US; O=DigiCert Inc; OU=www.digicert.com; CN=DigiCert High Ass
urance EV CA-1
*        SSL certificate verify ok.
* Server auth using Basic with user 'MichaelDrogalis'
> GET /derekerdmann/lunch_call.git/info/refs HTTP/1.1
Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
User-Agent: git/1.7.4.3282.g844cb
Host: github.com
Accept: */*
Pragma: no-cache

* The requested URL returned error: 403
* Expire cleared
* Closing connection #0
error: The requested URL returned error: 403 while accessing https://MichaelDrog
alis@github.com/derekerdmann/lunch_call.git/info/refs

fatal: HTTP request failed

这些是我拥有的git和curl的版本:

C:\Users\XPherior>git --version
git version 1.7.4.msysgit.0

C:\Users\XPherior>curl --version
curl 7.21.7 (amd64-pc-win32) libcurl/7.21.7 OpenSSL/0.9.8r zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap pop3 pop3s rtsp
smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate Largefile NTLM SSL SSPI libz

3
查看评论,该评论应作为答案发布。使其与1.7.1一起使用,也缺少用户名/密码提示问题。道具stackoverflow.com/a/9575906/805284 ...
sjas 2013年

2
检查用户有读库/写访问
席琳Aussourd

22
将来,在显示示例HTTP标头时,请勿粘贴“ Authorization:Basic <stuff>”。对base64进行解码并获取密码很容易。@mike:如果自发布此问题以来您尚未更改github密码,建议您这样做。
FlipMcF

4
@FlipMcF谢谢你。没有意识到。密码已更改。
Mike

6
@Mike NP。现在,我开始无耻地推广我在上面写的一个小博客:goo.gl/bpae94
FlipMcF

Answers:


836

我只是遇到了同样的问题,并找出了原因。

Github似乎仅支持ssh方式来读写存储库,尽管https方式也显示为“ Read&Write”。

因此,您需要将PC上的存储库配置更改为ssh方式:

  1. .git/config在您的repo目录下编辑文件
  2. url=在部分下找到条目[remote "origin"]
  3. 从更改url=https://MichaelDrogalis@github.com/derekerdmann/lunch_call.giturl=ssh://git@github.com/derekerdmann/lunch_call.git。也就是说,将@符号前的所有文本更改为ssh://git
  4. 保存config文件并退出。现在您可以用来git push origin master在GitHub上同步您的仓库

56
当您使用git只读地址(未登录时的默认地址)而不是read + write ssh地址进行克隆时,经常会遇到这种情况。
Nitrodist

43
.git/config更喜欢,url=https://github.com/mynickname/my_repo.git但是我也改变了它url=ssh://git@github.com/mynickname/my_repo.git,就成功了
Guillaume Flandre

12
您可以使用git remote set-url命令更改存储库网址。请参阅下面的答案。
fetsh 2012年

7
或使用git remote set-url <name> git@github.com:<username>/<repo>.git
iGbanam

42
对于那些寻求非ssh解决方案的用户,请在此处查看其他一些答案。将您的用户名添加到https url似乎可行。(更改配置url,以便https:// @ github.com / ...是UNAME@github.com / ...
Cyrus

431

为了绝对能够使用https协议登录,您应该首先将身份验证凭据设置为git Remote URI

git remote set-url origin https://yourusername@github.com/user/repo.git

然后,当您尝试输入密码时,系统会要求您输入密码git push

实际上,这是基于http身份验证格式的。您也可以设置密码:

https://youruser:password@github.com/user/repo.git

您应该知道,如果这样做,您的github密码将以纯文本格式存储在.git目录中,这显然是不可取的。


12
SSH在工作中被阻止,因此我必须使用HTTPS。添加用户名可以解决我的问题。
大卫·普尔

32
这应该是公认的答案。当有命令行界面时,没有理由手动编辑配置文件。
史蒂夫·本内特

4
另外,对我来说,这种方式(username @ github ...)要求输入密码并起作用,而ssh:// git @ github ...未能期望公钥身份验证。
史蒂夫·本内特

1
的作品,应该是公认的答案!尤其是在ssh无法正常工作的环境中,这是要走的路。谢谢!
AndreasEK 2013年

3
@Achint,这是一种身份验证格式。你可以设置你的密码过于https://youruser:password@github.com/user/repo.git尽管并不安全
蒂亚戈·马塞多

113

除了肖恩的答案之外,还有一小部分。

.git/config您可以使用git remote set-url命令来代替手动编辑文件。

在您的情况下,应为:

git remote set-url origin ssh://git@github.com/derekerdmann/lunch_call.git

我发现它比弄乱点文件更容易,更干净。


我不知道这是否只是一个旧帖子,并且git已经更改,但今天要解决此问题,我不得不git remote set-url origin ssh://git@github.com:derekerdmann/lunch_call.git在github.com和回购名称之间使用冒号
KevinL 2014年

56

.git/config在您的repo目录下编辑文件

url=在部分下找到条目[remote "origin"]

从更改url=https://github.com/rootux/ms-Dropdown.githttps://USERNAME@github.com/rootux/ms-Dropdown.git

USERNAME您的github用户名在哪里


这个答案不适用于我的问题。我的网址.git/config设置为` github.com/myrepo/subproject'
千焦耳2015年

Android Studio遇到此问题。工作良好。
AndroidDev

46

建议改用SSH的其他答案有点不足。支持HTTPS,但您必须使用GITHUB密码登录,而不要使用SSH密码登录(这正是给我同样的错误)。

我遇到了同样的问题,但是确保在终端密码提示符下使用我的实际GitHub密码可以解决方案,而无需更改配置或采用SSH。

注意这一点很重要的原因是,许多公共机构(例如我的学校)将阻止SSH,但允许HTTPS(这是我首先开始通过HTTPS克隆的唯一原因)。

希望对其他有同样问题的人有所帮助...


1
但为什么?过去我不必这样做。证书过期了吗?
Thufir 2012年

不知道,我不是专家,这就是我要如何解决这个问题:)
BMB 2012年

一样@Thufir。我不知道为什么这突然起作用。
尼克·曼宁

我用浏览器的用户名和密码登录就可以了。但是,当我尝试git push输入au和p时提示我,结果是权限被拒绝...。您知道我所缺少的吗?
奥马尔

26

Mac OS X上,相同的错误和解决方法

一切运行良好,直到我在GitHub上创建了一个新帐户并尝试推送

$ git push -u origin master

并得到错误:

remote:对OLDUSER的NEWUSER / NEWREPO.git权限被拒绝。致命:无法访问“ https://github.com/NEWUSER/NEWREPO.git/ ”:请求的URL返回错误:403

它应该通过为全局或当前回购设置user.name来解决

$ git config –-global user.name NEWUSER
$ git config user.name NEWUSER

但事实并非如此。

我通过从 “密码”部分下的“ 钥匙串访问”应用中删除与GitHub关联的OLDUSER来解决此问题。然后,push命令成功执行。

$ git push -u origin master

参考


从“钥匙串访问”应用中删除OLDUSER对我来说很有效
Augusto Triste

1
我遇到了相同的错误,但是由于不同但相关的原因,需要使用不同的解决方案。我试图推送到我没有写访问权限的存储库(我不是合作者)。这更多是由于我缺乏如何为非我的回购做贡献的知识。我以为我可以创建一个新分支,然后执行拉取请求。不是这样 我必须先对存储库进行分叉,在存储库上进行更改,然后从叉状存储库向原始存储库发出拉取请求。在我看来,这可能是一个愚蠢的错误,但是如果我能做到,那么我敢肯定其他n00b也可以。:)
Neo Neo

23

如果您使用的是Windows,则有时可能会发生这种情况,因为Windows将外部存储库(在我们的情况下为github)的凭据存储在其自己的存储中。保存在那里的凭据可能与您现在需要的凭据不同。

在此处输入图片说明

因此,为避免此问题,只需在此存储中找到github并删除保存的凭据即可。之后,在推送git时会要求您提供凭据,并允许您推送。


“您可能需要检查Windows凭据管理器,并control panel > user accounts > credential manager > Windows credentials > Generic credentials从此帖子中删除”细节下的github条目:stackoverflow.com/a/37450495
Miguel

这对我有效,我奋斗了将近2天,终于找到了解决方案。非常感谢你。
Sufiyan Ansari '18

1
你救了我的命!
writeToBhuwan '18 -10-25

1
我面临这个问题了一个多月谢谢
萨姆森Nzuki

1
天才。非常感谢
Vinod Kumar

18

这对我有用-:

git remote set-url origin https://username@github.com/user/repo.git

希望能帮助到你


1
不错的工作。设置用户!
marlonpya

1
该解决方案在CentOS 6.10 x86中使用了git v1.7。我期望密码显示出来(而不是SSH密钥),并且确实出现了(通过在远程URL <username>@之前添加github.com)。谢谢!
火神乌鸦

17

我认为@deepwaters对于较旧的版本得到了正确的答案。HTTPS URL需要具有用户名。我使用的是git 1.7.0.4,git push origin master在添加密码之前甚至都不要求输入密码。



11

403代码是“禁止”。服务器看到您的请求并拒绝了。您是否有权推送到该存储库?


1
我和一个朋友有同样的问题。回购是我的,他不能推。我们该如何解决?
gibson

如何获得许可
Bawantha

9

实际上,我对此有一个非常简单的解决方法。我所做的就是克隆存储库后以不同方式编辑git config文件。远程原始URL是您需要在默认配置文件中进行编辑的URL 。它看起来应该如下所示

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = https://*username*@github.com/*username*/*repository*.git
[branch "master"]
    remote = origin
    merge = refs/heads/master

^ this(或以下任何一种变体)
奥斯汀法国

在github.com之前添加用户名可以为我解决。
Shane

不客气@ÅdəəlÅhmåd。通过支持答案来支持这项工作,以便许多其他人可以欣赏。
larrytech

8

弄清楚了。我通过HTTPS克隆。设置我的公共SSH密钥,通过SSH克隆并通过SSH推送修复了它。


嗯...但是,例如,由于公司防火墙,您什么时候只能使用https呢?
filofel

1
我真的不知道 我现在总是通过SSH克隆。
迈克

关于filofel的评论,仅出于后代考虑(我注意到了时间戳):请查看上面列出的答案。我在学校有与您提到的相同的限制,发现我在终端提示中输入了错误的密码/口令。希望它可以帮助其他任何遇到相同问题的人。
BMB 2012年

8
  1. 单击您的存储库
  2. 在右侧,单击“设置”
  3. 在左侧的选项面板上,单击“合作者”
  4. 在GitHub中添加您认识的人名
  5. 点击“添加协作者”

在此之后,我们的“ Push to Git”工作正常。


谢谢!真的很有帮助!
sailfish009


7

这样做是为了临时修复

git push -u https://username:password@github.com/username/repo_name.git master


简单而有效
Bawantha


5

对于那些在使用ssh(根据Xiao)或http url时被拒绝403错误的权限的用户,请尝试以下命令

>git config --global --unset-all credential.helper

>git config --unset-all credential.helper

具有管理员权限

>git config --system --unset-all credential.helper

现在,每次Git都会要求输入登录名和密码。通过保存git config --global credential.helper store
CoolMind

4

从改变它

url=https://MichaelDrogalis@github.com/derekerdmann/lunch_call.git 

url=ssh://git@github.com/derekerdmann/lunch_call.git

有用!

不要忘记“ @”之前的“ git”。


它为我工作(将CentOS服务器与RStudio一起使用在代理后面)。首先设置代理:git config --global http.proxy http://proxyUsername:proxyPassword@proxy.server.com:port然后使用命令git remote set-url origin切换地址。
亚历山大·乔治

3

对于任何好奇的人,我的Mac机器vs lucid vm分别运行git 1.7.6和1.7.0.4,并且可以从我的mac(更新的git)中推送完全相同的存储库,但不能从VM中推送

相同的curl版本。也许某些较旧的git版本不支持https push?


是的,https推送到github可以在这里工作(甚至通过带有密码的代理)。我使用git 1.7.3。对我来说,它首先失败,因为我输入了错误的密码。
guettli 2012年

9
它适用于git 1.7.1,但是您也需要注意一件事(这是我第一次尝试中所忽略的):在HTTPS-URL中提供用户名,即url=https://username@github.com/username/repo.git
lwho

3

将用户名添加为URL的一部分,并且会发生此错误,因为git命令将http而不是https击中。因此设置网址

git remote set-url origin https://<username>@github.com/Path_to_repo.git

之后,将提示您输入密码:


3

对我有用的是:

我的回购是一个叉子,仍然与父母回购相关联。

git remote -v

会告诉您是否是您的回购。

git remote set-url origin https://github.com/USERNAME/OTHERREPOSITORY.git

允许您将其重新配置为您的存储库,然后进行推送。


3

以上答案均不适用于我的enterpriseGitHub帐户。请按照以下步骤通过ssh密钥生成方式进行推送。

通过访问您的git帐户创建一个仓库。

生成ssh密钥:

ssh-keygen -t rsa -C "your_email@example.com"

将文件〜/ .ssh / id_rsa.pub的内容复制到GitHub帐户设置中的SSH密钥中。测试SSH密钥:

ssh -T git@github.com
clone the repo:
git clone git://github.com/username/your-repository

现在cd到您的git clone文件夹并执行以下操作:

git remote set-url origin git@github.com:username/your-repository.git

现在尝试编辑文件(尝试自述文件),然后执行以下操作:

git add -A
git commit -am "my update msg"
git push -u origin master

更新:新的git版本似乎建议在创建新的回购协议时不要包含任何文件。因此,使一个空白回购。


2

我想出了自己的解决方案。

问题不是将协议从https更改为ssl,而是设置Github全局用户名和电子邮件!(我正在尝试推送到私有存储库。

git config --global user.email "your_github_email_@email.com"

git config --global user.name "Your full name"

对我不起作用。设置已设置,使用github.com ..中不带“ @”
ses


1

我现在遇到这个问题,结果是我的服务器/etc/resolver.conf文件的IP地址错误。可能会帮助别人。


1

这发生在我身上,是因为我的同事无意中禁用了从该存储库派生的存储库。请检查以确保原始git(hub)回购实际上仍然存在。


1

这可能是一个会计问题。上游(私有)存储库所有者的Github帐户可能不是财务帐户。我已经看到了客户的信用卡过期的地方。


1

对我有用的是从http更改为ssh:

git remote rm origin
git remote add origin git@github.com:username/repoName.git

然后用 git remote -v


1

我遇到过同样的问题。我的情况是:在github上创建git repo之前,我先在本地初始化它,然后尝试添加远程分支。我通过更改操作顺序解决了我的问题:在github站点上创建了一个存储库,然后在本地将其初始化。但是并不是像我这样喜欢命令行的人。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.