前言
最近一直在寫 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 clone
和 git pull
這裡操作。
配置完成之後,重啟 apache2 即可。
service apache2 restart
在遠端的計算機上便可以通過 http 的方式 clone 建立在這臺伺服器上的 git 倉庫了。
git clone http://yourip:port/git/yourproject.git
遇到的問題和解決方法
-
收到原有搭建的網站影響而不能下載。
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
-
有可能會遇到這樣的問題,發現你想要上傳程式碼的時候報錯
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
,然後再試著上傳程式碼就可以了!
結尾
其實在 github,gitee 上直接建立 git 倉庫是最省事的辦法,而且他們也提供了很好的輔助工具。我是剛好在學習 django 的過程中想到了要搭建一個 git 倉庫,同時因為部分環境用不了 ssh ,所以就搭建了一個屬於自己的 git 伺服器。學習新的知識也是個令人愉快的事情,共勉!
參考
progit.pdf
git-http-backend
Git Over Http: Service not enabled: 'receive-pack'
conf 檔案配置