使 VirtualMin git 模块变得智能

使 VirtualMin git 模块变得智能

我使用 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,它可以执行所有钩子,而且据说速度也更快。

  1. 将 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
    
  2. 在 上/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
    
    [...]
    
  3. 然后重启 apache。现在所有 repos 都可以在 上使用,例如 ,并且所有钩子都将按预期执行。http://[email protected]/dev/git/*http://[email protected]/dev/git/reponame.git

继续,当您通过 Virtualmin 创建新的 repo 时,您需要执行以下手动步骤:

  1. 创建一个空文件/home/domain/public_html/git/reponame.git/git-daemon-export-ok

  2. 创建此文件/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."
    
  3. 按照此链接,设置 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
    
  4. 更新/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] "
    

相关内容