2014-05-08

給windows使用者的簡易Git環境架設



我們公司屬於小型開發團隊,使用windows開發.net or asp程式,而開發的專案都屬於封閉專案,不能對外公開,所以要導入版本控制還是自己架設版控的Server比較保險。

隱約還記得前一篇文章講到架設比較簡易的SVN Server(明明就沒幾天),現在閱讀完介紹Git的書之後,才發現原來自己大錯特錯! Git Server的架設超簡單的啊!

雖然網路上搜尋如何架設Git Server的文章很多,但幾乎都只寫給Linux user看的,好我知道你們很強對指令都很熟悉,但難道使用windows的開發團隊就只能旁邊畫圈嗎?

windows使用者看了google來的Git教學文章,應該通常第一個疑問就是:
「那些指令在哪打?命令提示字元(cmd)裡面沒有耶!」
對,所以假設你跟我一樣是超新手,底下從頭開始,順便幫自己筆記一下...

環境和需求就大概如下:
  1. 想用Git
  2. 一個不對外公開的版控Server
    其實就個人使用,並不一定需要Server,但如果需要與別人共同開發專案,或是自己開發環境的電腦不只一台,那麼還是架個Server吧。
  3. 使用windows環境的client端(每個開發者的工作電腦)
  4. 人數不多
  5. 方便管控帳號
  6. 只利用ssh連線即可

所以這篇文章主要就是給符合上述條件的人看。

建議:底下文章雖然是無腦照著做就可以架好,但要知道為何這麼做,最好是先了解一下Git在做啥,可以看這本中文的電子書,看完就了解Git怎麼運作啦,如果嫌太多想慢慢看,最起碼也要看到第三章完才行喔!(如果全部看完,不錯,也不用看這篇文章了,因為電子書裡面全部都有寫XD)

初步了解Git後,我們就趕快進行吧~


流程:
  1. windows os可用的Git client環境
  2. 設定Git Server
  3. 設定client端連線
  4. 設定專案環境與使用者
  5. 測試一下
  6. 開始使用!快用啊!


一、建立好windows底下Git Client環境


首先必須裝好最基本的Git環境,請先到http://git-scm.com/downloads點下Download,下載一個Git client端。

下載回來當然就開始安裝啦,有需要特別說明的會在底下提示,沒有的話就是按下一步即可。


這裡可把紅框處打勾,這樣在打指令的視窗的字型會比較好看(爽度問題)


選擇第一個即可,盡量不要讓Git指令干擾原本的cmd


這裡就很重要了,如果你確定所有的開發人員都是windows電腦,未來,未來的未來也不會有非windows系統加入專案,那麼你可以選第三項,這樣不會有轉換換行符號的問題。
不過保險點我們還是選擇第一項即可。這樣非windows使用者在從server讀取專案下來的時候也不會有換行符號的問題。


接著讓他跑完即可。


到此,windows環境的Git就已經裝好囉!


二、設定Git Server

雖然你可能不願意也不想碰Linux,但為了使用Git,我們還是必須使用Linux當Server才行,因為他本身就提供了ssh的支援。如果你有辦法讓windows支援ssh連入那其實也行,但是太麻煩了,所以還是用Linux吧!

我們這裡的範例使用Ubuntu Server,可以用公司不要的小電腦來裝,怕不保險的話也可以使用Amazon EC2弄個最簡單的Ubuntu Server來跑。

如果你是自己安裝,在選擇套件的時候只要記得OpenSSH有打勾即可,其他所有的服務都不用選。反正這台Server只要開22 Port就可以了。


底下的操作都是在Server端,採用文字介面輸入指令完成。

我測試Server的相關環境參數(底下說明與截圖都在此環境下,操作時請依自己環境修改)
IP:192.168.140.131 (依你自己環境的IP而定啊XD)
管理者帳號:eric (依你自己環境的帳號而定啊XD)
Git帳號:git
版本庫放置位置:/home/git/repositories
所需套件:Git(Git主要程式)、Gitosis(好用的簡易權限、金鑰管控套件)

注意!因為帳號也有個git,所以版本控制的Git,G會是大寫,而帳號git的g則是小寫,避免分不清哪個是哪個(本文所有的git都是如此分)。

再來安裝必要的東西
sudo apt-get install git-core python-setuptools

建立git帳號
sudo adduser --home /home/git --disabled-password git
按下幾次enter就完成git帳號建立。

這邊講解一下為甚麼要如此做。其實如果真的是超小型的團隊,可能只有兩三個人,那不需建立git帳號也行,直接在Server上開好每個人的帳號,讓他們用自己的帳號登入即可。但考慮到管理的麻煩,日後擴編或是其他因素等等,如果用此法,那還要管理一堆server上的帳號,增加自己的負擔;還有個最主要的重點就是:每次push到server上都要輸入密碼啊!煩死了,小型封閉環境,ssh就夠安全了我不想每次都要輸入一次密碼。所以不建議如此做。就讓大家都用git帳號登入。

而Gitosis套件就是為了解決此問題而產生的,他的管理系統非常好用,可以讓我們輕鬆的管理每個人的連線,而不需實際在主機上新增/移除帳號,這樣大家都可以用git@server:xxx.git這樣的格式來取得或上傳版本庫到Server上。管理者也可以輕鬆地維護帳號,只要把收到的金鑰檔放到本機資料夾,編輯一下設定檔,再同步回去Server即可。(這部分後面會提到,很酷!)

所以我們馬上來安裝一下Gitosis

下載最新Gitosis套件並且安裝:
cd ~
git clone https://github.com/tv42/gitosis.git
cd gitosis
sudo python setup.py install

Gitosis預設會把/home/git這個目錄裡面的repositories資料夾當成所有repository根目錄,以後所有的專案就都放在裡面。

到此,Git server已經將近完工,只差連線設定和產生專案資料夾了,快吧!


三、設定連線


server端和client端都要做設定,這裡先從client端開始

client端:

在桌面或任一資料夾空白處按滑鼠右鍵,在出現的選單裡面選擇「Git Bash」


會跳出一個類似Linux的文字操作視窗,未來所有Git相關的操作我們都必須利用它來完成。這也解決了文章開頭第一個疑問,要在哪裡打指令?就是這裡啦!


首先我們產生一個自己的公鑰與私鑰對,每台要連線到Server的「人」都要照底下步驟1~3產生一次。
為什麼要特別註明是「人」呢?因為ssh連線是認金鑰的,就算你有很多台電腦都需要連線到Git Server(譬如公司和家裡的桌機和筆電),產生自己的金鑰也只要做一次,之後只要把自己的私鑰複製到其他台電腦的正確路徑就可以連線了。


1. 輸入指令:
ssh-keygen -t rsa -C "your@email"

參數-C的意思是指定這個金鑰的識別碼,預設是「帳號@這台電腦的主機名稱」,但我們為了好管理以「人」為主的金鑰,而不是以「電腦」為主,所以用每個人唯一的識別值Email比較好管理。
他會問你要把key放在哪,直接按enter用預設的位置就行。


2. 再來會問你這個金鑰是否要密碼,直接按兩次enter,這樣日後每次push到server就不用都要輸入密碼。


3. 產生完成,會有兩個檔案,副檔名有.pub的表示是公鑰,沒有副檔名的是私鑰,請好好保存你的私鑰。


如果你是Git Server管理者,才需要做底下步驟,如果只是普通使用者,那麼只需要做到此,然後把產生的id_rsa.pub寄給管理者就行了。

4. 接著要把管理者公鑰上傳到Server上,輸入
cd ~/.ssh
scp id_rsa.pub eric@192.168.x.x:/tmp/id_rsa.user1.pub
第一個紅框就是剛才上面我們產生公私鑰的路徑,第二個紅框是Server上的管理者帳號(因為它才有權限寫入),第三個是Server的IP,第四個則是Server上暫時存放公鑰的路徑和檔名(檔名可以修改,這樣比較好知道是誰的公鑰,也避免被覆蓋)。


5. 首次使用ssh連線該server的話,他會問你是否要信任這台server,請輸入完整yes


6. 然後就會問你管理者密碼了,輸入之後就可上傳成功

到這邊client端的連線設定就完成了。接著讓我們回到server上,做完剩下一點點的小設定。

Server端:


1. 使用管理者登入後,到我們剛剛上傳的資料夾去看,應該就可看到剛剛上傳上來的公鑰檔了。
eric@ubuntu:~$ cd /tmp
eric@ubuntu:/tmp$ ll
總計 16
drwxrwxrwt  2 root root 4096  5▒▒  8 13:31 ./
drwxr-xr-x 22 root root 4096  5▒▒  8 12:41 ../
-rw-r--r--  1 eric eric  395  5▒▒  8 13:22 id_rsa.user1.pub
eric@ubuntu:/tmp$


2. 接著我們就要來初始化Gitosis
eric@ubuntu:~$ sudo -H -u git gitosis-init < /tmp/id_rsa.user1.pub
[sudo] password for eric:
Initialized empty Git repository in /home/git/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /home/git/repositories/gitosis-admin.git/
eric@ubuntu:~$ sudo chmod 700 /home/git
eric@ubuntu:~$ sudo chmod 700 /home/git/.ssh
eric@ubuntu:~$ sudo chmod 600 /home/git/.ssh/authorized_keys

第一行sudo指令,-H表示切換到使用者的家目錄執行,哪個使用者?就是後面-u參數所帶的git帳號。
最後三行指令,是確保git的權限,這在某些Linux上如果沒有如此設定,會無法連線成功(像如果是在QNap NAS上面架設的話,這三個資料夾的權限一定要如此設定,不然怎樣都無法讓你連線,我就是為了這個問題搞了好幾個小時....)
這樣我們就完成了Gitosis的初始化,和建立管理者的連線設定了。

此時稍微測試一下,回到你的電腦打開Git Bash,輸入
ssh git@ServerIP

如果Gitosis有正確載入你的公鑰的話,應該會顯示底下訊息:

表示ssh連線正常。但Gitosis不允許除了Git以外的操作,所以會中斷連線。


四、管理Gitosis


我們前面說過,Gitosis有很酷的管理方式,他本身就是一個Git Repository,只要我們clone回來,修改裡面的檔案,再push回Git Server,他就會幫我們作好相關設定(譬如新增連線的公鑰、專案權限設定)。

如果你是管理者(會照這篇文章做的應該就是管理者吧XD),馬上就來試一下看:

首先我們把Server上的gitosis-admin專案給clone到本機電腦:
git clone git@192.168.140.131:gitosis-admin.git


接著到專案目錄看一下,可看到底下結構:


keydir目錄裡面存放目前所有Git使用者的公鑰,以後要加入使用者,只要把他們的公鑰丟到這個目錄,編輯好設定檔之後,再同步回去到Server上即可。

gitosis.conf就是主要的設定檔,我們可以編輯裡面的設定來加入專案或使用者。
這是剛初始化好的內容,裡面指定了gitosis-admin管理員的公鑰名稱,只允許一個管理員來管理gitosis-admin

我們首先來看一下要怎麼新增一個使用者:
假設要新增的使用者email是dp1@email.com,讓他產生好自己的金鑰檔(注意-C參數),然後從他那取得他的公鑰檔,重新命名為dp1@email.com.pub之後,放到keydir目錄內。

接著編輯gitosis.conf,加入專案名稱和擁有寫入權限的使用者:
專案名:project1
使用者:your@email.com, dp1@email.com

接著提交更新,並同步回Server:
git add .
git commit -m '看這次做了那些修改,描述一下'
git push origin master

同步回Server之後,Gitosis就會自動幫我們該做的事情都做好了,包括增加新的使用者公鑰到git帳號,做好權限,甚至不用我們自己開Repository,在本地端建立好之後Push到Server上,若是這個Repository不存在則會自己建立,超屌吧!

五、測試一下


再來我們可以測試一下是否成功了,隨便使用任何一台具有連線Git Server權限的電腦,先在本機上產生上面所說的project1 Git倉庫:

1.先到你專案目錄產生一個project1資料夾


2.進到該資料夾,空白處按滑鼠右鍵選Git Init Here


3.隨便新增個檔案(如readme.txt)(因為要有檔案才能commit)


4.打開Bash


5.輸入
git add .
git commit -m 'Init'
git remote add origin git@ServerIP:project1.git
git push origin master
注意紅框處,專案Repository要記得加.git
這邊我們完全沒在Server上手動增加專案,Gitosis自動幫我們完成了,可看到Push之後的結果第一行,自動幫我們Initialized empty Git repository in /xxx,好用吧!


6.其他共同協作者就可用
git clone git@ServerIP:project1.git
指令,將Server上的Repository下載回來一起使用啦~~

五、開始使用


就可以開始使用Git做版本控管。









嗯?用啊?都架好了還放著做啥?XD




後記:網路上也有很多圖形化的Git GUI工具,可以讓我們不用打指令,也有清楚的介面讓我們知道專案流程如何。但真的誠心建議,先學會文字指令,知道甚麼指令在做甚麼事之後,使用GUI工具才會上手,不然也只是亂玩一通而已喔!