设置 git smart http 后无法推送。拉取和克隆正在运行

设置 git smart http 后无法推送。拉取和克隆正在运行

我正在尝试在我的服务器中设置 git,并使用智能 http 作为访问机制。由于一些集成问题,我们无法使用任何其他方法,只能使用 http 或 https 方法。

因此我关注了大量博客/文章并设法让它运行起来。

但是现在虽然克隆和拉取可以工作,但是推送操作却不起作用。

我在这里分享了相关的配置和日志。

配置

虚拟主机 Apache

SetEnv GIT_PROJECT_ROOT /var/www/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /home/fsmk/domains/git.fsmk.org/cgi-bin/git-http-backend/
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER

<Directory "/usr/lib/git-core/">
  AllowOverride None
  Options +ExecCGI -Includes
  Order allow,deny
  Allow from all
</Directory>

<LocationMatch "^/git/.*$">
  AuthType Basic
  AuthName "Private Git Repositories on git.fsmk.org"
  AuthUserFile /etc/apache2/conf.d/git.passwd
  Require valid-user
</LocationMatch>

Suexec 包装器

#!/bin/bash
PATH_INFO=$SCRIPT_URL
export GIT_PROJECT_ROOT=/var/www/
export GIT_HTTP_EXPORT_ALL=true
/usr/lib/git-core/git-http-backend

错误

克隆

这不会引发任何错误。这些是 Apache 访问日志。

IP - - [05/Jun/2018:17:55:13 +0000] "GET /git/testrepo.git/info/refs?service=git-upload-pack HTTP/1.1" 401 610 "-" "git/2.17.1"
IP - TESTUSER [05/Jun/2018:17:55:29 +0000] "GET /git/testrepo.git/info/refs?service=git-upload-pack HTTP/1.1" 200 656 "-" "git/2.17.1"
IP - TESTUSER [05/Jun/2018:17:55:30 +0000] "POST /git/testrepo.git/git-upload-pack HTTP/1.1" 200 18662 "-" "git/2.17.1"

这些是我的客户端机器上的 git clone -v 输出

Cloning into 'testrepo'&#x2026;
Username for 'http://git.fsmk.org': TESTUSER
Password for 'http://[email protected]': 
Server supports multi<sub>ack</sub><sub>detailed</sub>
Server supports no-done
Server supports side-band-64k
Server supports ofs-delta
Server version is git/2.11.0
want 7c9a3fe7d59991e187ba99ee6e3ecb4fcb68d1be (refs/heads/master)
done
POST git-upload-pack (165 bytes)
remote: Counting objects: 55, done.
remote: Compressing objects: 100% (45/45), done.
remote: Total 55 (delta 6), reused 0 (delta 0)
Unpacking objects: 100% (55/55), done.

apache 错误日志和 suexec 日志中没有错误。这些是 apache 访问日志

IP- - [05/Jun/2018:17:58:29 +0000] "GET /git/testrepo.git/info/refs?service=git-upload-pack HTTP/1.1" 401 610 "-" "git/2.17.1"
IP - TESTUSER [05/Jun/2018:17:58:36 +0000] "GET /git/testrepo.git/info/refs?service=git-upload-pack HTTP/1.1" 200 656 "-" "git/2.17.1"

本地客户端上的输出也是正常的

推(这就是问题所在)

没有 suexec 错误。这些是 apache 访问日志。

IP - - [05/Jun/2018:18:03:51 +0000] "GET /git/testrepo.git/info/refs?service=git-receive-pack HTTP/1.1" 401 610 "-" "git/2.17.1"
IP - TESTUSER [05/Jun/2018:18:03:59 +0000] "GET /git/testrepo.git/info/refs?service=git-receive-pack HTTP/1.1" 200 539 "-" "git/2.17.1"

推送过程POST在行后挂起。这是我的客户端上的详细推送输出

Pushing to <http://git.fsmk.org/git/testrepo.git>
Username for 'http://git.fsmk.org': TESTUSER
Password for 'http://[email protected]': 
Counting objects: 2, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 240 bytes | 240.00 KiB/s, done.
Total 2 (delta 1), reused 0 (delta 0)
POST git-receive-pack (393 bytes)

(hangs)

这是推送操作后 apache 错误日志显示的内容。它处于无限期挂起状态。

这些是 apache 错误日志

[Tue Jun 05 18:09:00.134148 2018] [cgi:warn] [pid 5586] [client 45.124.158.238:51094] AH01220: Timeout waiting for output from CGI script /home/fsmk/domains/git.fsmk.org/cgi-bin/git-http-backend
[Tue Jun 05 18:09:00.134254 2018] [core:error] [pid 5586] (70007)The timeout specified has expired: [client IP:51094] AH00574: ap<sub>content</sub><sub>length</sub><sub>filter</sub>: apr<sub>bucket</sub><sub>read</sub>() failed

笔记:

我正在推送的更改非常少。我只是删除一个文件并提交它并推送。

日志中的 IP 是我的客户端 IP 地址的占位符,TESTUSER 是使用 htpasswd 进行身份验证的用户

操作系统:Debian 9(服务器)、Arch(客户端)
Apache 版本:2.4.5
Git 版本:2.11.0(服务器)、2.17.0(客户端)

我们也在服务器上使用 Virutalmin。

我在这个问题上遗漏了什么吗?为什么推送不起作用?

有没有更好的方法使用 http/https 在互联网上为单个 git 仓库提供服务?

答案1

可能是 git 后端无法写入给定目录,然后就挂起了(使用 ps -ef|grep git 验证)。这可能损坏了存储库,因此进一步的推送会失败。

为了使其发挥作用

1)整个目录树必须由 git.www-data 拥有,并可由组写入(chown -R git.www-data,chmod -R go+rw)

2)创建空的 repo(git init --bare),然后尝试克隆和推送。

是的,ssh 是提供 git repos 的更好的方式。

相关内容