close

Git Server on Windows 安裝手記

from http://huan-lin.blogspot.tw/2011/05/install-git-server-and-apache-on.html

這篇主要是記錄我在 Windows 平台安裝 Git 的過程。先描述一下作業需求:
  • 用戶端和伺服器端的作業系統都是 Windows。
  • 用戶端要能透過 HTTP 的方式存取版本庫。
  • 無論是取出檔案還是送交檔案,都需要驗證身分(輸入帳號密碼)。
底下是安裝步驟:

更新

Step 1: 安裝 Git for Windows

在 Windows 環境使用 Git,可以用 msysgit (Git for Windows),我安裝的版本是 v1.7.9 Preview 的版本(Git-1.7.9-preview20120201.exe)。下面幾張圖片是安裝過程的畫面截圖。





裝好之後,程式集裡面會多出一個選單:Git,裡面有兩個程式:Git GUI 和 Git Bash。前者是圖形操作介面,後者是命令列視窗。Git 的預設安裝目錄是 c:\Program Files\Git(64 位元作業系統則是 c:\Program Files (x86)\)。

HTTP 存取

由於我要讓用戶端可透過 HTTP 協定來存取版本庫,因此還要把 Git 安裝目錄下的 bin\libiconv2.dll 複製到安裝目錄下的 libexec\git-core\ 底下。少了這個動作,將來透過 HTTP 存取版本庫時,就會出現 HTTP 500 Internal Server Error 的訊息(這是安裝 v1.7.4 時碰到的情形,我不確定之後的版本是否還會如此)。如下圖所示:


安裝完成後,為了讓 git 可以正確處理中文,還得設定一下 git 的全域參數。做法是開啟 Git Bash 命令列視窗:開始 > 程式集 > Git > Git Bash,然後輸入以下命令:

$ git config --global gui.encoding utf-8

Git 的全域組態檔的完整路徑檔名是 C:/Users/使用者帳戶名稱/.gitconfig。

Step 2: 安裝 Apache HTTP Server

欲提供 HTTP 的存取方式,可以利用 Apache HTTP Sever。我安裝的版本是 Apache 2.2.19(包含 OpenSSL)。

安裝好 Apache 之後,修改組態檔 httpd.conf,令它使用 8080 port,以免和 IIS 搶 80 port。

接下來,一樣是修改 httpd.conf。找到 <directory> 標籤,確認其設定如下:

<directory />
  Options FollowSymLinks
  AllowOverride None
  Order deny,allow
  Allow from all
</directory>

接著在 httpd.conf 的最後面加入以下文字:

#Set this to the root folder containing your Git repositories.
SetEnv GIT_PROJECT_ROOT D:/GitRepos

# Set this to export all projects by default (by default, 
# git will only publish those repositories that contain a 
# file named “git-daemon-export-ok”
SetEnv GIT_HTTP_EXPORT_ALL

# Route specific URLS matching this regular expression to the git http server. 
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:/Program Files/git/libexec/git-core/git-http-backend.exe/$1"

<Location /> 
    AuthType Basic 
    AuthName "GIT Repository" 
    AuthUserFile "D:/GitRepos/htpasswd"
    Require valid-user        
</Location> 

其中第一道指令是告訴 Git 你的版本庫放在哪裡,第二道指令表示該目錄下的所有版本庫都可以透過 http(s) 的方式存取。第三道指令則是令 Apache 把 Git 相關 URL 導向給 Git 的 http 處理程式。注意:如果你的 Windows 作業系統是 64 位元,裡面的 C:/Program Files/.... 就要改一下。最後的 <Location> 區段設定了虛擬根路徑 "/" 的驗證規則,D:/GitRepos/htpassword 是帳號密碼檔。
 
完成上述修改之後,重啟 Apache HTTP 服務。

Note: 如果你希望將來透過遠端存取版本庫時,一律使用 http://my-server/git/* 開頭的 URL,則可將 ScriptAliasMatch 指令改為 "(?x)^/git/(.*/(HEAD | \ ......."
 
Step 3: 建立版本儲存庫
 
這裡先建立一個測試用的版本庫,以確認用戶端可以透過 HTTP 協定取出檔案。步驟如下:
  1. 開啟 Git Bash 命令列視窗:開始 > 程式集 > Git > Git Bash。
  2. 輸入以下命令,以建立一個空的版本庫('$' 符號是提示字元,不用輸入):

    $ cd D:/GitRepos
    $ git init MyProject
參考下圖:
 
 
 
此範例的 git init 命令會在 MyProject 目錄下建立一個名為「.git」的隱藏目錄,Git 用來管理版本所需的控制檔案全都放在這裡。MyProject 這個目錄本身則是工作目錄,你可以在此目錄下加入檔案或子目錄。
 
Note: 在初次建立一個可讓多人共享的版本庫時,應該要使用 git init --bare 命令。加上 --bare 的參數,表示要建立「單純的」版本庫,也就是不含任何工作複本(working copy)檔案,而只包含版本控制相關的檔案。

Note: 版本庫的根目錄(這裡是 D:\GitRepos)之下的第一層子目錄不必一定要建立成版本庫。我們也可以在其下建立單純的子目錄,然後在各個子目錄底下建立版本庫。例如: 

D:\GitRepos
 +-- Projects
  +-- PrjA (版本庫)
  +-- PrjB (版本庫)
 +-- Notes
  +-- DotNet (版本庫)

這樣的話,以後我們就可以用類似「http://my-server/Projects/PrjA」的網址來存取版本庫。
Step 4: 取出版本庫
 
比較正確的說法,是把版本庫複製(clone)一份回自己家裡(本機)。一樣開啟 Git Bash 視窗,切換到你打算存放本機版本庫的目錄,然後使用 git clone 把檔案庫拉回來。指令如下:
 
$ cd d:/Work
$ git clone http://localhost:8080/MyProject
 
接著應該會要求你輸入帳號和密碼,若輸入正確,便可將本庫取回。參考下圖:
 
 
使用 git clone 命令時,網址也可以包含使用者帳戶名稱,例如:
 
$ git clone http://michael@localhost:8080/MyProject

如果欲複製的遠端版本庫不是空的,Git 會先壓縮檔案再傳送,而且在螢幕上顯示壓縮的進度,如下圖:

 
下一步
 
後續的作業,就是在本機的工作目錄下進行日常的檔案修改與版本提交程序了。這部分的操作程序和指令,網路上已經可以找到很多參考資料,就不在此贅述。

後記:我後來又整理了一篇<Git over HTTPS on Windows>,可以讓 Git(其實主要是 Apache)支援 HTTPS 協定。
 
參考資料

 

7 回應:

undancer 提到...

看了那么多Git的安装文章,还是中文亲切。(泪)

匿名 提到...

非常好的文章,感謝提供。
另外請問可否提供人員的權限管理?
譬如限制某些人只能 pull某些專案,謝謝!

Huanlin Tsai 提到...

這個部份我還沒研究耶...也許可以找看看 Gitosis 有沒有幫助。

匿名 提到...

我自己也在windows下建立了一個git的http server,
想要做到有人更動server上的資料時可以發送mail給同一個專案的人員,
看了一些資料說要啟用hook功能,但是這些hook都是linux用的,
windows下都無法發揮作用,
所以想請教一下是否有什麼方式可以在windows下啟用git hook的功能
謝謝~

Huanlin Tsai 提到...

你是打算每當有人 commit/push 就發送 mail 通知嗎?這樣似乎太頻繁了。Anyway, 可能是因為 Git on Windows 是執行於 cigwin 環境下,所以不像 Subversion 只要寫個檔名合乎規範的 exe 程式就能運作。我一時也沒找到現成可以用的 hook for Git on Windows 範例。一個比較笨的作法,是用一個排程定時去 pull 新檔案下來,若發現有新檔案,就發 email 通知。理論上似乎可行。

Huanlin Tsai 提到...

我在想,有沒有可能捨棄 Git,改用 Mercurial?同樣都是分散式版控系統,Mercurial 比 Git 簡單些,對 Windows 平台的支援也更好,還有現成的 Mercurial.Net 類別庫可以協助你撰寫 hook。

匿名 提到...

謝謝回覆
我的選擇只兩個,SVN和GIT
這兩個是可直接整合到XCode(iOS開發工具)
SVN我已經有可以運作的系統
不過考慮到往後的一些狀況所以想要另外建立一個GIT系統
更重要的是公司內只有我在用版本控制系統
其他人沒在用,最多只知道(聽過)SVN和GIT(和我合作是會強制用SVN)
所以其他的版本控制系統目前不在考慮的範圍內

arrow
arrow
    全站熱搜

    zer931 發表在 痞客邦 留言(0) 人氣()