我需要使用git-over-http(智能http)设置一个git服务器,但是在线可用的资源很混乱,混合了其他apache配置,缺少细节或者不够明确。
我自己根据我发现缺乏可用资源的问题回答了这个问题。
答案 0 :(得分:34)
首先,有必要了解git-over-http有2个组件:git和apache。这两个通过名为git-http-backend的脚本连接。挑战在于配置这两个组件之间的接口,以便通过apache转发对git的http请求。
注意:安全性超出了本指南的范围。
首先使用您的发行版的软件包管理器安装git和apache2。
添加apache所需的模块以启用git-over-http。这些是cgi,别名和env
$ a2enmod cgi alias env
/etc/apache2/httpd.conf
(不删除其中包含的任何内容)<VirtualHost *:80>
SetEnv GIT_PROJECT_ROOT /data/git
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
ScriptAliasMatch \
"(?x)^/(.*/(HEAD | \
info/refs | \
objects/(info/[^/]+ | \
[0-9a-f]{2}/[0-9a-f]{38} | \
pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
git-(upload|receive)-pack))$" \
"/usr/lib/git/git-http-backend/$1"
Alias /git /data/git
<Directory /usr/lib/git>
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
/data/git
(如果你还没有任何回购,请不要担心,只需使用你所在的目录打算放置它/他们)同时将/usr/lib/git/git-http-backend
替换为系统上git-http-backend的位置,可以使用$ find / -name git-http-backend
可能是您的系统REDIRECT_REMOTE_USER
实际上覆盖了有效的REMOTE_USER
。如果此设置在完成后无效,请尝试删除该行。
根据this来源,可能需要将目录标记中的最后两行替换为Require all granted
以用于apache 2.4 及更高版本。
$ apache2ctl -k graceful
现在已经设置了apache服务器,但我们还没有完成,设置repos的一些重要部分会影响此设置是否有效。
$ mkdir myrepo.git
$ cd myrepo.git
$ git init --bare --shared
$ cp hooks/post-update.sample hooks/post-update
$ git update-server-info
$ chown -R wwwrun:www
重要的是要了解最后一行将repo的所有者更改为apache2用户。此用户可能在您的系统上有所不同。要查找apache用户,请执行$ ps aux | egrep '(apache|httpd)'
。然后,要查找用户的组名,请执行$ id user-name
。在我的系统上,用户是 wwwrun ,组 www 。相应地替换。
要使用回购,您需要知道该网址。对于此设置,网址为http://server.domain/myrepo.git
注意:http s 不起作用。
从客户端访问repo时,只需将其添加为远程:
$ git remote add origin http://server.domain/myrepo.git
然后你可以像任何其他git repo一样与它进行交互。