本文參考、翻譯此篇文章

這篇文章著重在如何建立一個私人(private)且可透過SSH遠端控制、分享(remote, shared)的Git Repository,而非講解什麼是Git和怎麼使用,環境是Ubuntu 10.10 & 10.04。

Step 1: Preparation & Accounts Setup

假設我們有一個小型開發團隊,成員有:John, Andrew & Robert。首先要幫他們創建帳號,並加到開發者(developers)的群組內

$ sudo groupadd developers
$ sudo useradd -G developers -d /home/john -m -s /bin/bash john
$ sudo useradd -G developers -d /home/andrew -m -s /bin/bash andrew
$ sudo useradd -G developers -d /home/robert -m -s /bin/bash robert

接著設定密碼


$ sudo passwd john
$ sudo passwd andrew
$ sudo passwd robert

[Optional] Connecting to the Gi Server Without a Password

這個步驟是利用RSA keypair的概念讓使用者在ssh連線至server時不用輸入密碼,一個專案少說都要push, pull等動作數十次,每次都要輸入密碼絕對受不了,更別說當新的程式急著上線時。

RSA Keypair概念簡單來說便是我們可以創建一個密碼鎖,有public(鎖頭)和private(鑰匙),將public(鎖頭)上傳至server。如此一來,每次在連線時SSH便會幫我們去check電腦上的private key(鑰匙)與server上的public key(鎖頭),若有符合則可直接連線。

註:井字號為註解

$ cd ~/.ssh
$ ssh-keygen -t rsa -C "[email protected]"
# Generating public/private rsa key pair.
# (text omitted)
# Your public key has been saved in /home/john/.ssh/id_rsa.pub

創立完key pair後,可以看看public key長怎麼樣子

$ cat id_rsa.pub
# ssh-rsa AAAAb4kzaC1 (text omitted) 86n3iEEQ78cPVazr [email protected]

接著,連上server將這些public key資訊寫到authorized_keys設定檔中。

註:若沒有.ssh資料夾或是authorized_keys檔案就自行創建,記住.ssh要放在使用者(john)的家目錄。

$ ssh [email protected]
# Password: ...
$ cd ~/.ssh
$ vi authorized_keys
$ cat authorized_keys
# ssh-rsa AAAAb4kzaC1 (text omitted) 86n3iEEQ78cPVazr [email protected]
$ exit

完成後,再連線一次就不用再輸入密碼了。

***若覺得每次都要打那麼落落長的帳號及伺服器資訊(如:[email protected])很麻煩的話,可以將這些資訊按照格式加在使用者(非server)的ssh設定檔(~/.ssh/config)內,如下。


Host company
User john
Port 22
HostName git.yourcompany.com

完成後,就只要輸入"ssh company"即可連線。

Step 2: Setting Up a Shared Git Repository

接下來假設我們有個管理者帳號 manager(需有sudo權限),家目錄是/home/manager,所有屬他管的projects都放在這,再將權限分下去給開發者。

一開始先建立一個資料夾 repositories,並創一個 project.git資料夾作為我們測試的專案。接著在專案資料夾內初始化一個bare repository,且設定shared的flag,告訴git說這個專案會用群組的方式分享出去。


$ cd ~
$ mkdir -p repositories/project.git
$ cd repositories/project.git
$ git init --bare --shared=group
# Initialized empty shared Git repository in repositories/project.git/
$ ls
# branches config description HEAD hooks info objects refs

完成git的初始化後,我們還得對這些資料夾進行權限的設定,讓在developers群組下的使用者都可以存取


$ sudo chgrp -R developers .
$ ls -l
# drwxrwsr-x 2 manager developers 4096 2011-01-19 13:38 branches
# -rw-rw-r-- 1 manager developers 126 2011-01-19 13:38 config
# (text omitted)

Step 3: Accessing the Shared Git Repository

完成以上的權限設定後,將這個專案實體化給developers群組內的所有使用者。在Linux的系統中,可以用symbolic link的方式讓資料夾在其他位置一起共用。

$ sudo ln -s /home/manager/repositories/project.git/ /home/john/
$ sudo ln -s /home/manager/repositories/project.git/ /home/andrew/
$ sudo ln -s /home/manager/repositories/project.git/ /home/robert/

設定好server部分後,回到開發者(local)的電腦上去clone這個專案

$ mkdir -p ~/work/project/
$ cd ~/work/project/
$ git clone [email protected]:project.git .
# Initialized empty Git repository in ~/work/project/.git/

注意:以上的git clone適用在server的ssh連線還是預設的22 port,若ssh的port非預設請按照下面的方式

git clone ssh://[email protected]:5566/~/project.git .

# 在port的/後接上該project的path即可

成功clone後,新增一個readme檔案,並push上server看看是否成功


$ echo "Hello" > readme.txt
$ git add readme.txt
$ git commit -m "Adding a readme file"
$ git push origin master
# Commit messages ...

Conclusion

網路上有很多Git Tutorial,但卻很少有一篇文章在教導如何省錢。Github確實為大家在做project上帶來很多方便,但public repositories常常不是開發者所需要的,尤其是在做一個商業性專案。

當然,在Github上可以申請private repositories,但價錢是從每個月美金$7起跳,只能放5個private repositories,且沒辦法把其他共事者(collaborator)做群組;若超過5個專案,那就得升級到每月$12或$22美金的方案。再者,若是公司組織層級,內部有許多小group,那就得用商業方案,從每月25美金起跳。

絕大時候已經有個每月$20~$30美金的VPS,何不在上面也host一個git server呢??或許一開始的安裝與設定步驟較多,但一個專案只要設定一次,不只省下些錢,還可以學習到更多server administration的技巧,一舉多得。

還在思考什麼呢??   Just do it right now & Please feel free to contact me.