在服务器上使用 smart http 搭建 Git 服务器

前言

最近一直在写 django 网页的代码,随着代码的量越来越大,管理起来也有点复杂(当然,有在使用 git 进行代码管理)。同时由于有不同的工作环境,有些工作环境对 ssh 的访问有限制,所以想到了在自己的服务器上面搭建 http 协议的 git 仓库。在这里记录一下搭建的过程以及期间遇到的问题和解决方案,以便有需要可以取用。

环境的安装

往下走之前,事先说明一下我的 linux 环境。
我的所有搭建都是建立在树莓派系统Raspbian之上,其他的环境均是根据 apache 的 conf 文件配置 说明所写。

作为主角 git 自然是不能缺少。

sudo apt-get install git

其次是搭建 http 要用到的 apache2。

sudo apt-get install apache2 apache2-utils

apache 配置

启用 apache 模块

配置 apache2.conf(httpd.conf) 文件之前需要先启用 mod_cgi, mod_alias,mod_env 等 Apache 模块。

a2enmod cgi alias env

配置 apache2.conf

接下来是配置 apache2.conf(httpd.conf),根据 linux 系统的版本有区别。
因为我用的是树莓派,所以配置路径在 /etc/apache2/apache2.conf
配置的模板:

SetEnv GIT_PROJECT_ROOT (存放 git 库的文件夹)
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ (git 请求处理器的路径)

<Directory "/usr/lib/git-core*">
  Options ExecCGI Indexes
  Order allow,deny
  Allow from all
  Require all granted
</Directory>

<LocationMatch "^/git/.*/git-receive-pack$">
  AuthType Basic
  AuthName "Git Access"
  AuthUserFile (授权文件)
  Require valid-user
</LocationMatch>

需要添加到配置文件的配置例子:
参考:progit.pdf

SetEnv GIT_PROJECT_ROOT /opt/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/lib/git-core/git-http-backend/

<Directory "/usr/lib/git-core*">
  Options ExecCGI Indexes
  Order allow,deny
  Allow from all
  Require all granted
</Directory>

<LocationMatch "^/git/.*/git-receive-pack$">
  AuthType Basic
  AuthName "Git Access"
  AuthUserFile /opt/git/.htpasswd
  Require valid-user
</LocationMatch>

经过如此配置,已经可以实现 git clonegit pull 这里操作。
配置完成之后,重启 apache2 即可。

service apache2 restart

在远程的计算机上便可以通过 http 的方式 clone 创建在这台服务器上的 git 仓库了。

git clone //yourip:port/git/yourproject.git

遇到的问题和解决方法

  1. 收到原有搭建的网站影响而不能下载。
    a. 由于我在服务器上搭建了 django 网页,django 网页的过滤器可能会受到 /git/ 的影响,所以要在 django 中对该 url 不进行处理。
    b. 还有一种方法是建立虚拟机映射到其他端口。
    这个方法需要将添加的文件囊括在 <VirtualHost *:port></VirtualHost> 中,如下

    <VirtualHost *:8000>
      SetEnv GIT_PROJECT_ROOT /opt/git
      SetEnv GIT_HTTP_EXPORT_ALL
      ScriptAlias /git/ /usr/lib/git-core/git-http-backend/
    
      <Directory "/usr/lib/git-core*">
        Options ExecCGI Indexes
        Order allow,deny
        Allow from all
        Require all granted
      </Directory>
    
      <LocationMatch "^/git/.*/git-receive-pack$">
        AuthType Basic
        AuthName "Git Access"
        AuthUserFile /opt/git/.htpasswd
        Require valid-user
      </LocationMatch>
    </VirtualHost>
    

    同时要在 port.conf(httpd.conf) 中加入虚拟机映射的端口的监听:

    Listen 8000
    
  2. 有可能会遇到这样的问题,发现你想要上传代码的时候报错

    E:\Codes\Git\MyWeb>git push
    fatal: unable to access '//hello.vip/git/MyWeb.git/': The requested URL returned error: 403
    

    这个有可能是因为服务器的 git 库没有更改 http.receivepack 配置,进入你要配置的 git 仓库 sudo git config http.receivepack true,然后再试着上传代码就可以了!

结尾

其实在 githubgitee 上直接建立 git 仓库是最省事的办法,而且他们也提供了很好的辅助工具。我是刚好在学习 django 的过程中想到了要搭建一个 git 仓库,同时因为部分环境用不了 ssh ,所以就搭建了一个属于自己的 git 服务器。学习新的知识也是个令人愉快的事情,共勉!

参考

progit.pdf
git-http-backend
Git Over Http: Service not enabled: ‘receive-pack’
conf 文件配置