无法使用http / https将Git推送到远程存储库

时间:2011-03-10 19:39:19

标签: git http https push

我在服务器上由apache提供服务的目录中有一个Git存储库。我已经配置了WebDAV,它似乎正在运行。 Litmus取得100%的成功。

我可以从远程主机克隆我的存储库,但在尝试推送http或https时,我收到以下错误:

错误:无法访问网址 https://git.example.com/repo/,返回代码22致命:git-http-push failed

有什么想法吗?

8 个答案:

答案 0 :(得分:35)

编辑.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的身份验证详细信息,然后推送到所需的分支。

答案 1 :(得分:11)

强烈建议尽可能不使用WebDAV。如果必须使用HTTP / HTTPS,则建议通过WebDAV使用git-http-backend CGI脚本。

答案 2 :(得分:3)

与此post comment一样,您/Web/git/Logs/ErrorLog对该错误的评价是什么?

  

查看/Web/git/Logs/ErrorLog后,我发现锁定文件存在权限问题。   在我的httpd-dav.conf中,我有一行......

DavLockDB “/usr/var/DavLock”
  

然后我检查了/usr/目录,缺少“var”目录。

$ mkdir var
$ cd var
$ chown www .
$ chgrp www .
  

然后重复这个过程似乎现在我可以推! =)


正如Eddie在评论中和Arrowmaster在他的(upvoted)answer中提到的,smart http protocol现在是最近Git发布的一部分。
git-http-backend CGI脚本可以通过http。

处理任何git命令

smart http

  

智能协议(git和ssh)将改为与服务器上的git upload-pack进程进行对话,这将确定客户端所需的确切对象集,并仅使用这些对象构建自定义包文件并将其流式传输


Git 2.17(2018年第二季度)将添加一个调试辅助工具。

commit a2b9820Patryk Obara (dreamer)(2018年1月24日) (由Junio C Hamano -- gitster --合并于commit 39a1dd8,2018年2月13日)

  

http-push:改进错误日志

     

git push由于服务器端WebDAV错误而失败时,这并不容易   指出罪魁祸首   有关确切cURL错误和HTTP服务器响应的其他信息有助于调试目的。

答案 3 :(得分:2)

您可能需要将用户添加为存储库的成员,并可能更新权限。

我们必须与将为我们的组织github存储库做出贡献的每个成员执行此操作。

答案 4 :(得分:2)

我遇到了同样的问题,并找到了解决方案,也许对某人有用。
Here是我使用git-http-backend配置和ldap身份验证的解决方案。

答案 5 :(得分:1)

我有一个类似的问题,我可以使用HTTP协议从存储库中克隆和提取,但我无法推送。我通过以下方式解决了这个问题。

我在项目的.git / config文件中更改了远程的url以匹配GitHub SSH url。然后,我按照“https://help.github.com/articles/generating-ssh-keys#platform-linux”上的所有说明进行操作,并使用“https://help.github.com/articles/error-permission-denied-publickey”进行问题排查。最好的部分是我没有处理Apache或更改远程服务器上的任何HTTP设置。

答案 6 :(得分:1)

我在Windows上遇到了同样的问题,我的凭据存储在Windows凭据管理器中。我不希望每个用户都必须编辑配置文件,因此我将网址从http://example.com更改为http://git@example.com,即使我的ID不是git也能正常工作。我不认为用户“git”在任何地方定义并假设任何名称都可以。 (如果您不在专用网络上,请确保使用https)。

答案 7 :(得分:0)

使用gitweb enable编写经过身份验证的git dav virtualhost的示例可以解决您的问题:

<VirtualHost *:443>
        ServerAdmin admin@example.com
        ServerName git.example.com

        DocumentRoot /var/git

        # SSL configuration
        SSLEngine on

        # Fix dav header
        #RequestHeader edit Destination ^https: http: early

        <Directory /var/git>
                DAV on
                Options ExecCgi FollowSymLinks

                # Gitweb config
                AddHandler cgi-script .cgi
                DirectoryIndex .gitweb.cgi
                SetEnv GITWEB_CONFIG /var/git/.gitweb.conf

                # Basic auth config
                AuthType Basic

                # Auth title
                AuthName "Git repositories"

                # Use file and external providers
                AuthBasicProvider file

                # File location
                AuthUserFile /var/git/.htpasswd

                Require method GET OPTIONS PROPFIND
                <LimitExcept GET OPTIONS PROPFIND>
                        Require valid-user
                </LimitExcept>
        </Directory>
</VirtualHost>

然后只需与用户克隆您的存储库即可:

git clone https://user@git.example.com/repository

当您尝试按下时,会询问您的密码并提供密码。

将密码放在克隆网址中是一种安全性较差的做法,因为任何人都可以在您的.git / config中读取该密码。