星期二, 5月 31, 2011

簡單設定GIT http server (for Windows and Unix),Git Http Server for Dummies

在Windows上設定

原本在Windows上因為中文檔名一直有問題,不敢使用Git,看到Git Source Control Provider再試中文檔名仍然不行;後來雨蒼告知有對岸的高手tinyfish對msysgit做patch,並放在Googlecode上utf8-git-on-windows,事情才有轉機。

原本也有考慮Mercurial,Windows上中文檔名雖然也有問題但是有方法修復,未採用的原因是Windows平台沒有Visual Studio provider。而且Xcode己經內建Git整合,為了自己方便當然採用Git才是明智之舉。(個人覺得Google Code採用水銀有點是基於對Python的偏執,
難保爾後不會有Git支援XD
。Update: 2011/07 Google Code支援Git了!)。關於Google的看法,詳見Analysis of Git and Mercurial

首先當然是要安裝 patch過的git和TortoiseGit,接著下載Apache for Windows,我是下載 httpd-2.2.19-win32-x86-openssl-0.9.8r.msi安裝。
使用網路上最常見的這篇教學仍然失敗,加上REMOTE_USER設定還是不行,只要是用到git-http-backend.exe的檔案都出現403 Forbidden,例如HEAD、info\refs等,檔案權限已經設成everyone full access仍然有問題;後來回頭用舊方法WebDAV才搞定。

除了原本需要的alias_module、auth_basic_module、authn_file_module,還要啟用dav_module、dav_fs_module、dav_lock_module。我是沿用原來的http.conf,另外加上 extra/git.conf,在原來的http.conf最後加上
Include conf/extra/git.conf
如果要Include conf/extra/httpd-dav.conf的方式啟用WebDAV要注意httpd-dav.conf裏的DavLockDB必須要寫入權限的檔案,所以預設的目錄通常不是不存在就是無法寫入。還有預設的upload目錄AuthType等等,要看是否有啟用。所以我並沒有Include,而是簡單地加入一行
DavLockDB "C:/TEMP/DavLock.txt"

git.conf的內容如下:
<directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Allow from all
</directory>
ALIAS /git "C:/GitRepository"
<Location /git>
AuthType Basic
Dav on
AuthName "GIT Repository"
AuthUserFile "C:/Apache2.2/權限檔"
Require valid-user
</Location>

在Linux上設定

若是在Ubuntu則是WebDAV與cgi方式都可正常執行。
Ubuntu在 /etc/apache2/sites-available/加上 git.conf ,同樣在預設的
/etc/apache2/sites-enabled 做link
/etc/apache2/sites-enabled$ sudo ln -s /etc/apache2/sites-available/git.conf .
git.conf內容如下:
Alias /git /var/cache/git

<Directory "/var/cache/git">
Allow from all
</Directory>

<LocationMatch "/git">
Dav on
AuthType Basic
AuthName "Git"
AuthUserFile "/etc/apache2/權限檔"
Require valid-user
</LocationMatch>
別忘了 htpasswd -c 權限檔 帳號

Server端
cd C:\GitRepository 或 cd /var/cache/git
git --bare init project.git
cd project.git
git update-server-info

Client端
git config --global user.name "你的名字"
git config --global user.email "你的email"
git config --global color.ui true
git config --global http.sslVerify off
git config --global core.autocrlf false

cd "要放的目錄"
git clone http://你的帳號@你的伺服器/git/project.git/
cd project #Git很聰明,會自己忽略.git
#加上你的程式檔
git add
#我是加上 git add 嬑堃.txt
git commit -m "註解" #我是 git commit "堃嬑" ,此時就看得出patch過版本和Unix版本git同樣方便
#此時只有在local端加入
#接下來要傳回Server
git push -u origin master
#會出現兩次問passwd,這是用WebDAV的缺點,個人覺得還好
#之後要上傳只要打git push

備註:
話雖如此,我在將Subversion的Repository倒入Git Repository時,Windows版發生不明錯誤掛點,但是Unix版(FreeBSD/Linux)都沒事,所以請盡可能使用Unix版架Git Server,若覺得以上都太麻煩或是遇到奇怪的錯誤,就用github或是bitbucket吧!

參考資料: GIT官方網站Git 初學筆記 ihower介紹GIT的幾篇文章

5 則留言:

shoting 提到...

你好
Google Code採用Mercurial不至於是對python的偏執,記得有篇Google Code當初比較hg與git的文章,主要還是win32跟http的優劣,在那個時間點(2009) git在這兩項的確是比不上hg。

鳥毅 提到...

shoting,我也看過Analysis of Git and Mercurial,只是個人感覺啦~我已經修改原文以避免誤導:P

zoearthmoon 提到...

大大您好
我是第一次接觸git這軟體
目前是想先用
phpfog這網站去測試
但是無論怎麼clone都是錯誤
例如 Permission denied (publickey)
或 bad file number...
另外是這軟體要執行更新動作時
可以用很多通信方式
但是有沒有最簡單的通訊方式可以推薦的呢?
感謝您的回答!!

鳥毅 提到...

zoearthmoon:

  我大便很通暢,所以不要再叫我大大。

  GIT和我不熟,我只會基本操作;這篇也只是架repository的筆記呀~

  你第一次用git就挑戰我沒用過的phofog,我怎麼可能知道問題出在哪裡呢?建議你先從參考資料的 Git 初學筆記ihower介紹GIT的幾篇文章入手。

鳥毅 提到...

zoearthmoon:
  補充說明一下,Permission denied (publickey) 這種錯誤應該是沒有設定好public key,類似 Github 設定 public key,但你要自己看原網站設定,別人沒用過不可能幫你試。

  git在Windows環境中文永遠有問題,選擇git你只能不要用中文/utf8檔名,或是使用unix like OS。