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

Kyle023發表於2021-05-10

前言

最近一直在寫 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 http://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 'http://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 檔案配置

相關文章