如何在http上设置git?

时间:2014-11-04 12:15:45

标签: git apache http git-http-backend

我需要使用git-over-http(智能http)设置一个git服务器,但是在线可用的资源很混乱,混合了其他apache配置,缺少细节或者不够明确。

我自己根据我发现缺乏可用资源的问题回答了这个问题。

1 个答案:

答案 0 :(得分:34)

首先,有必要了解git-over-http有2个组件:git和apache。这两个通过名为git-http-backend的脚本连接。挑战在于配置这两个组件之间的接口,以便通过apache转发对git的http请求。

注意:安全性超出了本指南的范围。

  1. 首先使用您的发行版的软件包管理器安装git和apache2。

  2. 添加apache所需的模块以启用git-over-http。这些是cgi,别名和env

  3. $ a2enmod cgi alias env
    
    1. 将以下内容复制到/etc/apache2/httpd.conf(不删除其中包含的任何内容)
    2. <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>
      
      1. 现在用服务器上的git repos的父目录替换2次出现的/data/git(如果你还没有任何回购,请不要担心,只需使用你所在的目录打算放置它/他们)
      2. 同时将/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 及更高版本。

        1. 重新启动apache服务器:$ apache2ctl -k graceful
        2. 现在已经设置了apache服务器,但我们还没有完成,设置repos的一些重要部分会影响此设置是否有效。

          1. 设置回购:
          2. $ 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 。相应地替换。

            1. 使用repo
            2. 要使用回购,您需要知道该网址。对于此设置,网址为http://server.domain/myrepo.git

              注意:http s 不起作用。

              从客户端访问repo时,只需将其添加为远程:

              $ git remote add origin http://server.domain/myrepo.git
              

              然后你可以像任何其他git repo一样与它进行交互。