2013年1月8日星期二

建立Windows Git Server 失敗記

本來現在來說,如非工作上要求,實在沒有理由不用網絡上的Git服務,而自架Git Server。
不過本著學習理由,今天花了半天去自建,最後結果可說是半失敗,得出來的Git Server是可Clone,不可Push。

不知道是什麼原因,整個過程我遇到非常多問題,上網Search亦是很多人都有的問題。
我的軟件版本是:
  • Windows 7 32Bit & Windows 2008 Server 64Bit
  • Apache 2.2.21
  • Git-1.8.0-preview20121022 安裝版本 (安裝路徑 : C:\git\,注意下列寫的都以此為根本。 )
測試Git用 :
  • TortoiseGit-1.7.15.0-64bit (Windows Server 2008用)
  • Eclipse 4.2.1 + EGIT (Windows 7 作Client用)

詳細方法就不在此寫,因為網上太多教學,但就節錄安裝過程的問題和解決方法。

1. Error : git-upload-pack not permitted



遇到這個問題,原因是"C:\git\libexec\git-core"目錄中欠缺 libiconv-2.dll,不知道是版本問題還是什麼,很多教學文章都是寫libiconv2.dll (沒有"-"的),我在這個問題困擾很久都是因為看過幾個教學都是寫libiconv2.dll,但這是錯的!害我花很多時間一直在試。
而在"C:\git\bin"目錄下又的確有libiconv-2.dlllibiconv2.dll,只差一個"-",很容易混淆。

解決方法 :
由"C:\git\bin"複製至"C:\git\libexec\git-core"的是libiconv-2.dll,只需要它就可以,libiconv2.dll不用的。
之後你可以Double Click "C:\git\libexec\git-core\git-http-backend.exe"看看,如果是閃一閃關閉則是正常,出現錯誤訊息就代表失敗。

2. Error: The requested URL returned error: 403 while accessing http://www.MyGitRepo.com/refs?service=git-receive-pack fatal: HTTP request failed


出現403就幾乎多數是Apache的Access Right問題。

有幾個地方都有可能引發上述問題:
ScriptAliasMatch
很多文章都會教你設定httpd.confScriptAliasMatch,大多數網上找到的例子都是:
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))$" \
                        "C:/git/libexec/git-core/git-http-backend.exe/$1"

如果你是使用Xampp或者Apache預設的htdocs做web root,照著Copy & Paste應該問題不大。
但若果你跟我都是使用Virtual Host的話,就要修改成
ScriptAliasMatch \
        "(?x)^/192.168.1.13:9000/(.*/(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))$" \
                        "C:/git/libexec/git-core/git-http-backend.exe/$1"
第2行增加的是你Virtual Host的ServerName。

Apache的<location />Directive ,需要從httpd.conf抽離至httpd-vhosts.conf的<virtualhost />之中。
例如
<VirtualHost 192.168.1.13:9000>
ServerName 192.168.1.13:9000
DocumentRoot "D:/VirtualHost/GitRepo"
  <Directory "D:/VirtualHost/GitRepo">
  Options FollowSymLinks
  AllowOverride None
  Order deny,allow
  Allow from all
  </Directory>
<Location "/"> 
    AuthType Basic 
    AuthName "GIT Repository" 
    AuthUserFile "D:/VirtualHost/GitRepo/htpasswd"
    Require valid-user        
</Location> 
</VirtualHost>

3. Error : git-upload-pack / git-receive-pack: command not found


要解決這個Error有兩個方法 :
1. 使用Git Bash
分別輸入以下command,然後試試
git config remote.origin.uploadpack /path/to/git-upload-pack
git config remote.origin.receivepack /path/to/git-receive-pack
git update-server-info

2.加入Git的Path至環境變數
在Windows的系統 > 環境變數 > Path項目中加入Git的路徑 : C:\git\binC:\git\libexec\git-core,重新開機試試。


我自己用(1)的方法不行,我用(2)就成功。

4. Error : Cannot access URL http://xxx/, return code 22 fatal: git-http-push failed


這就是我解決不到的問題,上網找方法,很多人都說要用Apache的WebDAV才可以Push動作,但其實不應該的。
Git官方都有說自1.6.6版本開始有一個叫Smart HTTP的東西是可以不用WebDAV而做到Push動作的,但可惜我始終都搞不到,而網上找遍整個Google都沒有可行的方法,所以被迫放棄了。
情況跟這位網友一樣 - GIT over HTTP (GIT HTTP Transparent)

但我可以說,網上的教學質素很參差,照足去做亦未必一定成功。

當中我認為比較好的,可以參考:

1 則留言:

  1. .Net 托管實現的Git平臺可以選擇使用Git Candy了,功能比Bonobo更強大,速度更快、更穩定!
    歡迎您的使用!

    源碼在:http://github.com/Aimeast/GitCandy
    演示在:http://git.53wb.com
    Bonobo到GitCandy數據庫轉換程序:http://git.53wb.com/Repository/Tree/Bonobo2Candy/

    回覆刪除