這篇主要是記錄我在 Windows 平台安裝 Git 的過程。先描述一下作業需求:
更新
Step 1: 安裝 Git for Windows
在 Windows 環境使用 Git,可以到官網下載最新版的 Git for Windows。我安裝的版本是 v1.8.1.3 Preview 的版本。下面幾張圖片是安裝過程的畫面截圖(有些是舊版的畫面,但差異不大,就懶得更換了)。
裝好之後,程式集裡面會多出一個選單:Git,裡面有兩個程式:Git GUI 和 Git Bash。前者是圖形操作介面,後者是命令列視窗。Git 的預設安裝目錄是 c:\Program Files\Git(64 位元作業系統則是 c:\Program Files (x86)\Git)。
HTTP 存取
由於我要讓用戶端可透過 HTTP 協定來存取版本庫,因此還要把 Git 安裝目錄下的 bin\libiconv-2.dll (或 libiconv2.dll)這兩個檔案複製到 Git 安裝目錄下的 libexec\git-core\ 底下。少了這個動作,將來透過 HTTP 存取版本庫時,就會出現 HTTP 500 Internal Server Error 的訊息(從 v1.7.4 直到 v1.8.1.3 都是如此),如下圖:
安裝完成後,為了讓 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> 標籤,確認其設定如下:
接著在 httpd.conf 的最後面加入以下文字:
這樣的話,以後我們就可以用類似「http://my-server/Projects/PrjA」的網址來存取版本庫。
- 用戶端和伺服器端的作業系統都是 Windows(最近一次試過的版本是 Windows Server 2012)。
- 用戶端要能透過 HTTP 的方式存取版本庫。
- 無論是取出檔案還是送交檔案,都需要驗證身分(輸入帳號密碼)。
更新
- 2013-08-23:在 Windows Server 2012 上安裝 Git v1.8.1.3,同時對本文作了些修正,以減少安裝時碰到的問題。
- 2013-04-01:安裝了 Git v1.8.1.2,中文檔名的問題似乎已經完全解決。試過「許功蓋」等字都沒問題。
- 2012-04-04:安裝畫面使用 v1.7.9 Preview 的畫面截圖,此版本仍然無法處理中文檔名。
Step 1: 安裝 Git for Windows
在 Windows 環境使用 Git,可以到官網下載最新版的 Git for Windows。我安裝的版本是 v1.8.1.3 Preview 的版本。下面幾張圖片是安裝過程的畫面截圖(有些是舊版的畫面,但差異不大,就懶得更換了)。
裝好之後,程式集裡面會多出一個選單:Git,裡面有兩個程式:Git GUI 和 Git Bash。前者是圖形操作介面,後者是命令列視窗。Git 的預設安裝目錄是 c:\Program Files\Git(64 位元作業系統則是 c:\Program Files (x86)\Git)。
HTTP 存取
由於我要讓用戶端可透過 HTTP 協定來存取版本庫,因此還要把 Git 安裝目錄下的 bin\libiconv-2.dll (或 libiconv2.dll)這兩個檔案複製到 Git 安裝目錄下的 libexec\git-core\ 底下。少了這個動作,將來透過 HTTP 存取版本庫時,就會出現 HTTP 500 Internal Server Error 的訊息(從 v1.7.4 直到 v1.8.1.3 都是如此),如下圖:
問題排除:如果你用 HTTP 的方式存取 Git repository 時碰到錯誤代碼 403,請檢察 Git 所在的機器的防火牆設定,看看是不是 TCP port 被擋住了。我在使用 Windows Azure 的虛擬機器時,一開始沒有去設定 endpoint,結果無論怎樣都存取不到。
安裝完成後,為了讓 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 # 原本是 Deny 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/.... 就要改成 C:/Program Files (x86)/...。
- 最後的 <Location> 區段設定了虛擬根路徑 "/" 的驗證規則,D:/GitRepos/htpassword 是帳號密碼檔。這個檔案可利用 Apache 的 htpasswd 工具來產生。
完成上述修改之後,重啟 Apache HTTP 服務。
Note: 如果你希望將來透過遠端存取版本庫時,一律使用 http://my-server/git/* 開頭的 URL,則可將 ScriptAliasMatch 指令改為 "(?x)^/git/(.*/(HEAD | \ ......."
Note: 如果你希望將來透過遠端存取版本庫時,一律使用 http://my-server/git/* 開頭的 URL,則可將 ScriptAliasMatch 指令改為 "(?x)^/git/(.*/(HEAD | \ ......."
Step 3: 建立版本儲存庫
這裡先建立一個測試用的版本庫,以確認用戶端可以透過 HTTP 協定取出檔案。步驟如下:
- 開啟 Git Bash 命令列視窗:開始 > 程式集 > Git > Git Bash。
- 輸入以下命令,以建立一個空的版本庫('$' 符號是提示字元,不用輸入):
$ 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 over HTTPS on Windows>,可以讓 Git(其實主要是 Apache)支援 HTTPS 協定。
後記:我後來又整理了一篇<Git over HTTPS on Windows>,可以讓 Git(其實主要是 Apache)支援 HTTPS 協定。
參考資料
- Hosting a Git server under Apache on Windows by Jeremy Skinner
- Git over http(s) (SSL and WebDAV) with Apache on Windows by Jürgen Bouché
看了那么多Git的安装文章,还是中文亲切。(泪)
回覆刪除非常好的文章,感謝提供。
回覆刪除另外請問可否提供人員的權限管理?
譬如限制某些人只能 pull某些專案,謝謝!
這個部份我還沒研究耶...也許可以找看看 Gitosis 有沒有幫助。
回覆刪除我自己也在windows下建立了一個git的http server,
回覆刪除想要做到有人更動server上的資料時可以發送mail給同一個專案的人員,
看了一些資料說要啟用hook功能,但是這些hook都是linux用的,
windows下都無法發揮作用,
所以想請教一下是否有什麼方式可以在windows下啟用git hook的功能
謝謝~
你是打算每當有人 commit/push 就發送 mail 通知嗎?這樣似乎太頻繁了。Anyway, 可能是因為 Git on Windows 是執行於 cigwin 環境下,所以不像 Subversion 只要寫個檔名合乎規範的 exe 程式就能運作。我一時也沒找到現成可以用的 hook for Git on Windows 範例。一個比較笨的作法,是用一個排程定時去 pull 新檔案下來,若發現有新檔案,就發 email 通知。理論上似乎可行。
回覆刪除我在想,有沒有可能捨棄 Git,改用 Mercurial?同樣都是分散式版控系統,Mercurial 比 Git 簡單些,對 Windows 平台的支援也更好,還有現成的 Mercurial.Net 類別庫可以協助你撰寫 hook。
回覆刪除謝謝回覆
回覆刪除我的選擇只兩個,SVN和GIT
這兩個是可直接整合到XCode(iOS開發工具)
SVN我已經有可以運作的系統
不過考慮到往後的一些狀況所以想要另外建立一個GIT系統
更重要的是公司內只有我在用版本控制系統
其他人沒在用,最多只知道(聽過)SVN和GIT(和我合作是會強制用SVN)
所以其他的版本控制系統目前不在考慮的範圍內
請問 HTTP 500 的錯誤,除了是 libiconv2.dll 沒複製到 libexec\git-core 之外,還有其他可能性嗎?我在 Win 7 x86 安裝是 O.K 但在 Win 2008 R2 x64 就不 O.K。httpd.conf 的 Programs Files (x86) 有設定。
回覆刪除謝謝!!
可以看看 Windows 事件日誌裡面的錯誤訊息有沒有提供甚麼線索。
回覆刪除感謝你的文件,現在遇到一點問題想請教,在apache的設定上,我用的是httpd-2.2.19-win32-x86-openssl-0.9.8r.msi 這個版本,
回覆刪除連往:
http://127.0.0.1:10000/MyProject 時,log的錯誤訊息是
[Tue Oct 23 10:49:23 2012] [error] [client 127.0.0.1] File does not exist: C:/Apache2/htdocs/MyProject
請問是ScriptAliasMatch沒有設定對 還是..?
不好意思對apache設定不熟,先謝謝!
應該還是組態檔設定的問題吧,但我無法確定是哪個設定,可以檢查看看 GIT_PROJECT_ROOT,或其他與 repository 路徑有關的設定。
回覆刪除您好
回覆刪除不好意思有問題想詢問
我目前是參考您的文章在架設windows git server.
但在權限方面,會需要不同的目錄有不同的權限(htpasswd)
ex C:\GitReport\Project1, C:\GitReport\Project2
所以我在目錄(Project1)底下放置.htaccess
然後寫入
AuthName "Git Repo"
AuthType Basic
AuthUserFile ".htpasswd目錄"
require valid-user
但卻完全沒有效果。
google一些解決方式
ex
1. 在httpd.conf拿掉mod_rewrite.so的註解
2. 把httpd.conf中所有的AllowOverride都改成Allow
但仍然沒有效果。
我的apache是使用2.2版
請問這方面您有什麼建議嗎?
看看這帖是否有用:
回覆刪除http://stackoverflow.com/questions/6142437/make-git-directory-web-inaccessible
感謝回覆!
回覆刪除目前試了結果還是一樣
就如同.htaccess不存在似的
所有寫在.htaccess中的項目都沒反應
我再做些嚐試好了
謝謝!
感謝大大的分享
回覆刪除只是我安裝的時候碰到一個問題
我安裝的是git 1.8.1.2版
使用 git clone http://gitserver:8080/MyProject
下載的時候得到
fatal: http://gitserver:8080/MyProject/info/refs?service=git-upload-pack not found: did you run git update-server-info on the server?
請問大大知道是怎麼回事嗎
這我沒遇過耶,網路上有一篇 QA:
回覆刪除http://gitstack.com/questions/git-clone-fails-with-inforefs-not-found-did-you-run-git-update-server-info-on-the-server/
裡面提到,在 repository 目錄下建立一個空的檔案,檔名是 "git-daemon-export-ok",然後問題就解決了。不確定是否相關,參考看看囉。
其他建議包括:確認 URL 是否正確,存取檔案庫之帳號是否有足夠權限,以及環境變數 %PATH% 是否有指向正確的 Git\Bin 目錄。
不好意思,我研究很久還是找不到你步驟四的部分,那裏的帳號和密碼要去哪裡設定,可否請您指點迷津一下呢...OTZ|||
回覆刪除帳號密碼的驗證方式,是由 Apache HTTP server 控制。你可以修改 Apache HTTP server 的組態檔(httpd.conf)。這篇筆記裡面有範例:http://huan-lin.blogspot.tw/2008/07/subversion-14x-15.html
回覆刪除Trie的問題,我正好也碰上,答案是git預設的安裝路徑,中間有空白。我直接安裝在C:\git,問題就解決了(當然,httpd.conf相關路徑設定,得重新設定)。
回覆刪除