我正在尝试在我的服务器中设置 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'…
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 的更好的方式。