问题标签 [git-http-backend]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
477 浏览

git - Git Smart HTTP 协议无法在推送时执行服务器端挂钩

我正在尝试使用 git-http-backend 设置智能 HTTP。我试图在网上遵循大量关于如何做到这一点的文档/指南。我在 Windows 7 上运行 Apache 2.4。在我的 httpd.conf 中我有

对于C:\repos,我确保每个人都具有完全访问权限。我在我的用户帐户下运行 httpd.exe,因此向服务器发出的请求应该在 PATH 上看到 git 2.12.2 就好了。

C:\repos,我有一个名为foo.git. 在我做的那个回购里面git config http.receivepack true。我能够很好地克隆http://localhost/git/foo.git在没有启用服务器端挂钩的情况下,我能够很好地推送提交。

现在烦人的部分——我创建了一个更新钩子,C:\repos\foo.git\hooks\update它包含以下内容:

我尝试从本地仓库推送并获取

好的,所以我尝试使用 git 协议推送相同的内容——我运行git daemon --reuseaddr --base-path=C:\repos C:\repos. 然后我放了一个git-daemon-export-ok里面foo.git。我回到本地仓库并推送到git:///foo.git

一切顺利。我使用文件协议进行推送——file:///c/repos/foo.git这也可以。

我试着做一个

在我的 httpd.conf 中确保它与访问问题无关。我把它改回Require all denied了当然。

基于详细的推送,似乎 git-receive-pack 无法在服务器端启动 bash 解释器,但我不知道为什么。同样,它是从在我的用户帐户下运行的 httpd.exe 产生的,我可以手动执行 git。再一次,可以在 PATH 上找到 git 就好了。我在这里缺少什么样的明显解决方案?

0 投票
1 回答
968 浏览

git - uWSGI + nginx + git-http-backend

我在使用 uwsgi 在 nginx 上建立与 git-http-backend 的连接时遇到问题。我可以克隆 repo 但无法推送任何内容,因为:

看起来 git-http-backend 没有工作。这是 nginx.conf:

最后一个但并非最不重要的是 uwsgi.ini:

任何人都有一些建议,我可以做些什么来使推送可用并使用 git-http-backend。

编辑

我发现代码返回 22 的问题。它是 try_files:

如果我使用@git 加入本节,则 git start 有效。

不幸的是,现在我遇到的问题是,在有人克隆了 repo 之后,我无法再次克隆它。最糟糕的是,我无法提取/获取或有时推送更改。我拥有的唯一信息是:

我相信与 POST 的一些超时有关。您现在如何解决 POST 超时问题?

0 投票
0 回答
70 浏览

git - 提交推送后,裸 git repo 不可克隆

我自己的 git 服务器有问题,我只使用 git-http-backend。我发现在服务器上创建空存储库后:

我可以使用任何用户在任何主机上克隆空仓库,

但是在我进行更改后,存储库只能与一台主机一起使用。

总之,在进行更改后,存储库将分配给一台主机。我无法将存储库克隆到另一台主机。你知道出了什么问题吗?

编辑:

在服务器上我做:

在我制作的第一台主机上:

之后,我尝试将 repo 克隆到第二台机器:

这失败了:

之后,我尝试在第一台机器上克隆 repo,但复制到另一个目录:

但这也失败了

0 投票
1 回答
963 浏览

git - 带有 git-http-backend 的 nginx:具有 www-data 用户的 `git push` 的访问权限不足

我正在尝试使用 fcgiwrap 设置 nginx 以将请求转发https://<host>/git/<repo>.git到 git-http-backend。

服务器是新装的debian linux,所以后台应该不会有什么尴尬的事情。

错误场景

fcgiwrap 套接字以www-data用户身份运行,并且应该可以访问 git 存储库(见下文)。但是,当尝试推送时,我得到以下 git 消息(我认为与访问权限问题有关):

设置

nginx配置:

FastCGIWrap:

/opt/git 中的权限:

git repo 配置:

nginx 用户是组www-data的成员git

解决方法

  1. 奇怪的是,如果我chgrp -R www-data /opt/git/有效。我想拥有它git:git

  2. chmod a+s /usr/lib/git-core/git-http-*作品。现在我也可以做到chmod -R 705 /opt/git/,而且有效。我想是因为现在 root 用户执行命令。我怀疑这是安全的。所以不应该用...

  3. 使用 ssh。使用 ssh 工作,甚至以用户身份登录www-data并直接推送到 repo 工作(因为组权限设置正确!)。但是,这不是选项,因为https需要访问!

我错过了什么?

我的想法不多了。推送每个 ssh 有效。如果我这样做chown -R 770 /opt/git/了,我什至不能再通过 https 克隆或获取。因此,www-data用户似乎无法通过git-http-backendcgi 脚本进行访问。但为什么???用户是git组的成员,应该有组访问权限!!!

有关的

0 投票
1 回答
420 浏览

lighttpd - Lighttpd git-http-backend setenv 问题

我在 Ubuntu 14.04 上有一个功能设置,通过 apt 安装了 Lighttpd 1.4.33,它传递给 git-http-backend 以进行 git http pull/push。这是通过 ldap 验证的。ldap 组查找的新要求意味着我需要更新 lighttpd 以支持它。

由于 lighttpd 在 trusty/universe 上只能升级到 1.4.33,旧版本已被删除,因此下载了 Lighttpd 1.4.51 的副本,并从源代码编译:

在设置了几个缓存文件夹并设置了权限之后,lighttpd 启动并且似乎正在服务请求。当从客户端执行 git pull 时,日志会显示将其发送到 git-http-backend 的请求,但是在验证客户端后会在 git pull 上看到:

git repos 所在文件夹的权限看起来是正确的,并且 lighttpd 以与工作设置中相同的用户身份运行。

我的猜测是 lighttpd.conf 中的 setenv.add-environment 配置项没有被 git-http-backend 传递/拾取,所以它不知道物理文件在哪里。

我也尝试过编译不同版本的 lighttpd,但是它们都有相同的问题,可能我缺少编译选项。

下面的 lighttpd.conf 中的相关部分。

lighttpd -V

错误日志

欢迎任何建议,谢谢。

0 投票
1 回答
417 浏览

c - Git HTTP错误'致命:协议错误:错误的行长度字符:'

我目前正在尝试在没有现有 Web 服务器的情况下用 C 创建一个简单的 Git HTTP 服务器。目前我唯一要做的就是创建一个服务器套接字并使用来自客户端请求的环境变量执行 git-http-backend CGI 脚本。拉取请求已经有效,但仅适用于空存储库。当我尝试使用内容克隆存储库时,我在客户端收到此错误:

这是客户端和服务器之间的通信日志:

只是一点点说明:HTTP/1.1 200 OK 是手动添加的,其余的来自 CGI 脚本。你也可以在这里找到我的代码。首先我有这样的理论,服务器响应的内容有新行的错误放置(例如 HEAD 应该是更高的一行),但事实并非如此。所以我的问题是:有什么我能做的吗?在 C 中将这个响应编辑成一个好的格式是相当复杂的,尤其是对于较长的响应。

0 投票
1 回答
129 浏览

git - 如果要克隆的 repo 是子模块,git-http-backend 返回 500 错误

/git我有一个容器,它在绑定到它内部的路径上提供 git 存储库。此容器 nginx 配置:https ://github.com/ipburger/alpine-http-git-server/blob/master/nginx.conf

如果 repo on/git是一个子模块,则克隆失败并出现 500 错误,Nginx 的带有 git-http-backend 的 fastcgi 不会输出任何有关它的错误。

如果 repo 不是子模块,它照常工作。为什么会这样?

为了帮助我调试这个错误,我怎样才能找出为什么 git-http-backend 让 nginx 返回 500 错误?任何地方都没有错误消息。

为了帮助我解决这个错误,我怎样才能让 git-http-backend 能够克隆一个子模块?

0 投票
1 回答
80 浏览

git - git 客户端操作的 HTTP URI 是否有特定的正则表达式?

我正在尝试配置我的 Apache 反向代理以匹配 git 客户端使用 HTTP 后端访问的 URI,以进行身份​​验证¹。为此,我想在代理上匹配 URI 上的 HTTP 请求并以不同方式对待它们。后面部分没有问题,但我很难找到一个好的 URI 模式/列表来匹配这些请求。

到目前为止我发现的是:

  • 试验了记录服务器端(访问日志)和客户端(GIT_CURL_VERBOSE=1)。目前观察到:
    • GETs on <base-url>/info/refs?service=git-upload-pack
      (ls-remote,或初步获取/克隆)
    • GETs on <base-url>/info/refs?service=git-receive-pack
      (git push 的初步)
    • 发布到<base-url>/git-upload-pack
      (git fetch)
    • 发布到<base-url>/git-receive-pack
      (git push)
  • Git book on transfer protocols 中的文档,但这在设计上似乎不完整:

    本节包含传输协议的非常基本的概述。该协议包括许多其他功能,例如 multi_ack 或边带功能,但涵盖它们超出了本书的范围。

  • git-http-backend 手册页中建议的 Apache 配置。

    • 它假设您在单独的前缀上​​提供 git 存储库,但情况并非总是如此(请参阅我的脚注)。
    • 像这样的部分RewriteCond %{QUERY_STRING} service=git-receive-pack假设没有其他东西在同一个 VirtualHost 上提供服务,因为它会破坏非 Git 资源,除非我添加不带查询字符串的 URI 匹配的附加要求 ~ /info/refs$
    • 虽然它可能仍然是最新的,但它似乎有点过时了,因为它仍然显示 Apache 2.2 的授权配置示例。这让我想知道这是否得到了适当的更新并适合可靠的来源。

简单列出上述模式也让我担心的是:

  • 也许某些客户端的操作方式不同,例如“哑协议”或“智能协议 v2”?
  • Git 协议 2 可能会改变事情,或者不会?
  • 我真的找不到协议的HTTP 部分的规范。我可以在协议的 Git 级别找到很多东西,但从反向代理的角度来看,这不是我感兴趣的。
  • 结果,我可能会破坏用户的东西,由于代理上的模糊 URI 匹配,这很难调试......

因此,理想情况下,我想指出一些文档/代码,它显示了 git http 客户端可以操作的 URI 的完整概述。它可能是一个简单的正则表达式——这就是我最终要寻找的——只要它是权威的。


¹我正在尝试使用 Apache 作为身份验证反向代理执行 SSO 登录,通过 HTTPS 与常规网页对 Git 进行不同类型的身份验证。该应用程序 Gerrit Code Review 通过具有 SSO 身份验证并启用的公共 URL 前缀为页面和Git存储库提供服务auth.trustContainerAuth,因此我无法真正匹配例如.^/git/.*git-http-backend

0 投票
1 回答
149 浏览

git - 带有 http/2 的 git push 有时会挂起“17 字节杂散数据”

我在git-http-backend后面使用apache,一些(但不是全部)用户说这git push对他们来说很重要。启用后GIT_TRACE=1 GIT_CURL_VERBOSE=1,我们看到他们正在使用 http/2 并且有一条可疑的行说

当我要求他们强制使用 http/1.1 时,问题就消失了。Wireshark 似乎没有帮助,因为数据是加密的,而且我不知道如何调试这个问题。关于如何进行的任何想法都会非常有帮助!

为什么 http/2 会有杂散数据,我可以做些什么来调试这个问题?

0 投票
1 回答
169 浏览

linux - 尝试使用多存储库和多用户制作 git http 后端

我用 git http 后端制作了一个 git 服务器。
我创建了 2 个存储库 ( Project1, Project2) 和 3 个用户 ( user1, user2, user3)。

当我使用命令克隆时:

我只想要user1并且user2可以访问这个克隆(Project1)。

当我使用命令克隆时:

我只想user3访问这个克隆(Project2),并且user1不能user2访问它。

现在,我的配置服务器可以克隆、推送、拉取、合并……但所有用户都拥有相同的权限。
请帮我举一些例子。