【问题标题】:Cannot push Git to remote repository with http/https无法使用 http/https 将 Git 推送到远程存储库
【发布时间】:2011-07-13 00:07:28
【问题描述】:

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

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

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

有什么想法吗?

【问题讨论】:

    标签: git http https push


    【解决方案1】:

    就像在这个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 在 cmets 中和 Arrowmaster 在他的(赞成)answer 中所提到的,smart http protocol 现在是最近 Git 发行版的一部分。
    git-http-backend CGI 脚本可以通过 http 处理任何 git 命令。

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


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

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

    http-push: 完善错误日志

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

    【讨论】:

    • 我没有找到ErrorLog,但我可以说锁在那里并且权限很好。
    • 正如 ArrowMaster 所指出的,最好远离速度较慢且更容易发生更新冲突的 DAV。而是使用 git-http-backend.cgi 和适当的 apache ScriptAlias deinitions。
    • @Eddie:是的,我已经完成了我的回答(并赞成 ArrowMaster 的回答)以反映增强的协议。
    【解决方案2】:

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

    【讨论】:

    • 你说得对,我读过一本旧手册,其中没有提到 git-http-backend。所以我放弃了 WebDAV 并配置了这个。它更简单、更干净、而且有效!
    【解决方案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 的身份验证详细信息并推送到所需的分支。

    【讨论】:

    • 是的,只需添加用户名:密码对我有用,其他一切都失败了。
    • 我的配置已经有了一个用户名。我添加了一个密码,现在一切都很好。我不打算从 WebDAV 转移到我在 Synology NAS 上的带有 repo 的小项目......所以这个技巧是一个救生员!
    • 谢谢!将此用于同一本地开发机器上的多个 GitHub 帐户。没有愚蠢的 SSH 多身份配置。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

          • 请举例。
          【解决方案8】:

          使用 gitweb enable 编写经过身份验证的 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 中读取它。

          【讨论】:

            猜你喜欢
            • 2018-06-24
            • 2010-10-25
            • 2018-03-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-06-07
            • 2013-01-27
            相关资源
            最近更新 更多