git push致命失败


24

我以某种方式删除了我的代码分支的整个目录。我克隆了一个新的。除推动外,一切正常。

~/workspace/wtf (mybranch)]$ git push origin  mybranch 
error: Cannot access URL [my url], return code 22
fatal: git-http-push failed 

git pull可以,但是。我该如何解决?

git  push 

1
在这里阅读本手册并注意有关的要点http.receivepack
hhh 2012年

Answers:


33

我犯了一个错误,即使用https而不是ssh来获取新副本。从那时起,我进行了修改和提交,但是由于明显的原因而无法进行推送。

为了恢复,我简单地将.git / config中的[remote“ origin”]部分更改为

网址= https://github.com/AIFDR/riab_core.git

网址= git@github.com:AIFDR / riab_core.git

之后,我可以再次推动。


2
无需转移到其他协议,如果您想覆盖http,请阅读下面的答案。
罗勒A

1
同意Basil,这是不必要的,并且在某些通过防火墙等方式访问受限的公司环境中是不可能的

...问题出在git-http-push failed哪里,我看到操作人员正在尝试通过http或https -1建立内容。
hhh 2012年

14

仅使用git即可进行更快的HTTP推送-不需要webDAV

从git 1.6.6开始新的“ smart-http”支持。新方法允许整个包一次传输,而不是作为单个文件传输。

您还可以使用gitweb在同一位置提供可浏览的URL。

注意:由于访问是由apache控制的,因此您可以将任何Auth要求(htaccess或ldap等)添加到每个存储库的设置中。

该答案假定您拥有远程服务器,并且想要添加/修复http支持。

首先:检查apache日志,当apache尝试执行git-http-backed的cgi脚本时,它可能是权限被拒绝/无法定位错误。

向git添加HTTP支持

只需制作一个新的git_support.conf文件,并将其包含在apache中(在httpd.conf中添加include语句)

#
#  Basic setup for git-http-backend
#

SetEnv GIT_PROJECT_ROOT /opt/git_repos
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER  #IMportant !!! This could be your problem if missing

<Directory /opt/git>  # both http_backend and gitweb should be somewhere under here
        AllowOverride None
        Options +ExecCGI -Includes  #Important! Lets apache execute the script!
        Order allow,deny
        Allow from all
</Directory>

# This pattern matches git operations and passes them to http-backend
ScriptAliasMatch \
        "(?x)^/git/(.*/(HEAD | \
                        info/refs | \
                        objects/(info/[^/]+ | \
                                 [0-9a-f]{2}/[0-9a-f]{38} | \
                                 pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
                        git-(upload|receive)-pack))$" \
        /opt/git/libexec/git-core/git-http-backend/$1

# Anything not matched above goes to displayable gitweb interface
ScriptAlias /git /opt/git/cgi-bin/gitweb.cgi/

结果就是可以推/拉的能力:

me@machine /tmp/eddies $ git pull
Already up-to-date.

me@machine /tmp/eddies $ touch changedFile

me@machine /tmp/eddies $ git add .

me@machine /tmp/eddies $ git commit -am"commiting change"
[master ca7f6ed] commiting change
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 changedFile

me@machine /tmp/eddies $ git push origin master
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 239 bytes, done.
Total 2 (delta 1), reused 0 (delta 0)
To http://mysecretdomain.com/git/eddies
   0f626a9..ca7f6ed  master -> master

您可以在线浏览这些更改。 gitweb提供可浏览的界面

资料来源:http : //repo.or.cz/w/alt-git.git?a= blob_plain; f= gitweb/ README


当我对用户运行重要行(第7行)时,我得到"SetEnv takes 1-2 arguments, an environment variable name and optional value to pass to CGI."-为什么?
hhh 2012年

我猜该值是空的,因此setenv仅看到0个参数。由于该Apache使用重定向规则,因此REMOTE_USER可能为空,因此可以获取REDIRECT_RMEOTE_USER。如果已经定义了RMEOTE_USER(或者REDIRECT用户为空),则应该能够使分配为可选。httpd.apache.org/docs/2.0/mod/mod_setenvif.html#setenvif

7

要通过http 启用“ git push ”,必须在Web服务器上启用WebDAV。要针对Apache Web服务器执行此操作,只需编辑配置文件:

vim /etc/httpd/conf/httpd.conf

然后搜索以以下内容开头的行:

<Directory "/var/www/html">

在其后添加以下行:

Dav On

确保在httpd.conf中也没有注释以下行:

LoadModule dav_fs_module modules/mod_dav_fs.so

之后,您就准备好了。使用以下命令重新启动Apache Webserver:

service httpd restart

另外,请确保pache:apache用户和组使用以下命令可写入服务器上的所有git存储库文件:

chown -R apache:apache /var/www/html/your_git_repository

否则,执行“ git push”时,未能设置正确的权限将导致“ PUT错误:curl结果= 22,HTTP代码= 403”。

现在,只需在客户端计算机上执行“ git push”,一切都应该工作。


请注意,如果用户越过了这一障碍,但是却在apcahe日志中看到有关接收包stackoverflow.com/questions/792611/…

2
这将工作,但DAV 不是必需的,实际执行比智能HTTP慢得多。

4

您无法推送通过HTTP克隆的存储库。您需要将URL更新为URL ssh://git://Type URL。


我使用了相同的克隆命令。在我删除错误之前,它一直有效。–

你有git remote -v什么?
强大的橡皮鸭

并非完全正确。假设已启用DAV,则可以推回存储库。

6
这是不正确的。从1.6.6开始的Git使用apache和git-http-backend支持智能http推和拉。

3

编辑.git / config文件的以下部分:

[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = http://git.repository.url/repo.git

[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = http://username:password@git.repository.url/repo.git

然后尝试git push origin master

根据需要编辑配置文件中其他存储库URL的身份验证详细信息,然后推送到所需的分支。


注意:我使用了这种方法,并解决了我的问题-但是,我认为将密码存储在配置文件中似乎是错误的,因此我将其保留下来(希望得到提示),并能够如此使用它。
克里斯

git remote set-url origin ...也可以。
马克西米利安·希尔斯(Mayilian Hils)


0

我还有其他错误,但是可以!

我试着解释一下:

但是如何在推送消息中从文本中隐藏密码?


-1

如果您输入了错误的密码,也会发生这种情况。


我从未见过:我总是fatal: Authentication failed第一名
Rup 2012年
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.