本文參考、翻譯此篇文章。
這篇文章著重在如何建立一個私人(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.