我使用 VirtualMin 的 git 模块在我的其中一台服务器上通过 http 设置私有 git。我还有其他通过 ssh 的 git 服务器,但这是我第一次尝试通过 http 和 VirtualMin 设置它。
不幸的是,在过去的几个小时里,我发现默认的 VirtualMin 模块不使用智能 http 模式,而是通过 DAV 中继将提交推送到服务器。我不太喜欢这一点。
我还尝试将我的旧存储库移至此服务器,但由于没有 /info/ref 文件,因此无法使用它们。(我还听说使用智能 http 模式不需要此文件)
结果,我尝试查找有关安装 smart git http 的文档,发现了很多。但我认为它们都不与 VirtualMin 或其默认 git 模块兼容,
你们有人知道我需要如何定制我的 git 安装和 Apache 设置以使用智能 http 协议,而对 VirtualMin 的影响很小,并且仍然与 VirtualMin 兼容吗?
我真的不希望我的设置和配置在 VirtualMin 更新或设置的重新创建过程之后被删除,而这些控制面板通常会这样做。
请与我分享您对此事的看法。谢谢
操作系统:CentOs 6.5 x64
答案1
取自在 Virtualmin 上为 Git 设置智能 HTTP。
从这里解决方案是使用 git-http-backend 可执行文件从普通 HTTP 切换到智能 HTTP,它可以执行所有钩子,而且据说速度也更快。
将 git-httpd-backend 可执行文件复制到 /home/domain/cgi-bin/ 目录,并将权限设置为 domain:domain。这是为了避免 suexec 问题。
$ cp /usr/libexec/git-core/git-http-backend /home/domain/cgi-bin $ chown domain:domain /home/domain/cgi-bin/git-http-backend
在 上
/etc/httpd/conf/httpd.conf
,将其添加到域的 VirtualHost 中:[...] ServerName domain.com [...] # Set the root directory where git repositories reside SetEnv GIT_PROJECT_ROOT /home/domain/public_html/git # By default, the git-http-backend allows push for authenticated # users and this directive tells the backend when a user is authenticated. SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER # Export all repositories SetEnv GIT_HTTP_EXPORT_ALL ScriptAlias /dev/ /home/domain/cgi-bin/git-http-backend/ [...] # Add this if it’s not already there DAV on AuthType Basic AuthName domain.com AuthUserFile /home/domain/etc/git.basic.passwd Require valid-user Satisfy All RedirectMatch ^/git(/+)$ /git/gitweb.cgi RewriteEngine off AddHandler cgi-script .cgi [...]
然后重启 apache。现在所有 repos 都可以在 上使用,例如 ,并且所有钩子都将按预期执行。
http://[email protected]/dev/git/*
http://[email protected]/dev/git/reponame.git
继续,当您通过 Virtualmin 创建新的 repo 时,您需要执行以下手动步骤:
创建一个空文件
/home/domain/public_html/git/reponame.git/git-daemon-export-ok
。创建此文件
/home/domain/public_html/git/reponame.git/hooks/post-receive
并使其可由所有人执行,并归 apache:domain 所有:#!/bin/sh # # An example hook script for the "post-receive" event. # # The "post-receive" script is run after receive-pack has accepted a pack # and the repository has been updated. It is passed arguments in through # stdin in the form # # For example: # aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master # # see contrib/hooks/ for a sample, or uncomment the next line and # rename the file to "post-receive". # Echo to the client that you’re sending the mail now echo "Sending notification email..." . /usr/share/git-core/contrib/hooks/post-receive-email # Make sure to update the git repo info on the server for pulls by other clients git update-server-info echo "Updated server info."
按照此链接,设置 git 目录的权限如下,以避免在提交时推送新文件时出现写权限问题(同时确保 gitweb.cgi 脚本只有所有者可写,以避免在 /etc/httpd/logs/suexec.log 中出现 suexec 错误):
$ cd /home/domain/public_html/git/ $ chmod -R g+ws * $ chgrp -R domain * $ chmod -R g-w gitweb.cgi $ chmod -R g-s gitweb.cgi
更新
/home/domain/public_html/git/reponame.git/config
以匹配以下内容:[core] repositoryformatversion = 0 filemode = true bare = true [hooks] mailinglist = [email protected], [email protected] envelopesender = [email protected] emailprefix = "[REPONAME] "