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

25

我在服务器上的一个由Apache服务提供的目录中拥有一个Git仓库。我已经配置了WebDAV,并且它似乎正在正常运行。Litmus返回100%的成功率。

我可以从远程主机克隆我的仓库,但是当尝试通过http或https进行推送时,出现以下错误:

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

有任何想法吗?

8个回答

40

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


是的,只需添加用户名:密码就可以了,其他方法都失败了。 - gregn3
我的配置文件已经有了用户名。我添加了密码,现在一切都很好。我没有打算从WebDAV移动到Synology NAS上的仓库的小项目...所以这个提示真是救了我一命! - Greg Woods
谢谢!在同一台本地开发机上为多个GitHub帐户使用它。没有愚蠢的SSH多身份配置。 - RoboBear

11

如果可能的话,强烈建议不要使用WebDAV。如果必须使用HTTP/HTTPS,则推荐使用git-http-backend CGI脚本而不是WebDAV。


3
你说得没错,我读的是一份旧的手册,里面没有提到git-http-backend。因此我放弃了使用WebDAV并进行了配置。这样更加简单、干净、而且它起作用了! - Clément

3

在这个帖子评论中,你的/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所提到的,并且经过upvotesmart http protocol现在是最新Git发行版的一部分。
git-http-backend CGI脚本可以通过http处理任何git命令。

smart http

更智能的协议(git和ssh)会与服务器上的git upload-pack进程进行对话,该进程确定客户端所需的确切对象集,并构建一个仅包含这些对象的定制打包文件并将其流式传输。

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

请参见提交记录 a2b9820 (2018年1月24日),作者为Patryk Obara (dreamer)
(由Junio C Hamano -- gitster --提交记录 39a1dd8中合并,2018年2月13日)

http-push:改进错误日志

git push由于服务器端WebDAV错误而失败时,很难找到主要原因。
提供有关确切的cURL错误和HTTP服务器响应的附加信息有助于调试。


我没有找到错误日志,但我可以说锁定存在并且权限良好。 - Clément
正如ArrowMaster所指出的那样,最好不要使用DAV,因为它速度较慢且更容易出现更新冲突。相反,使用git-http-backend.cgi和适当的apache ScriptAlias定义。 - Eddie

2

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


2

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

我们需要对每个将在我们组织的 GitHub 存储库上贡献的成员执行此操作。


1
我在Windows上遇到了同样的问题,我的凭据存储在Windows凭据管理器中。我不想让每个用户都编辑配置文件,所以我将URL从http://example.com更改为http://git@example.com,即使我的ID不是git,它也可以工作。我认为没有定义用户"git",并且任何名称都可以使用。(如果您不在私有网络上,请确保使用https)。

请给出示例。 - DeshDeep Singh

0
以下是一个示例,展示如何编写带有启用gitweb的身份验证git dav虚拟主机,这可能会解决您的问题:
<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

当你尝试推送时,它会要求你的密码并提供它。

将密码放在克隆URL中是一种安全不良实践,因为任何人都可以在你的.git/config文件中读取它。


0

我曾经遇到过一个类似的问题,可以使用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设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接