
在開發的過程中往往需要一個git伺服器來管理和儲存代碼,如何自己架設一個git伺服器呢,方法很簡單,這裡介紹一下如何架設git伺服器,搭建gitweb和push代碼之後發送郵件通知組内成員。
1. 架設Git伺服器
我們以Ubuntu為例。首先,在git伺服器上建立一個名為 'git' 的使用者,并為其建立一個.ssh 目錄。并将其權限設定為僅git使用者有讀寫權限
$ sudo adduser git
$ su git
$ cd
$ mkdir .ssh
$ chmod 700 .ssh
接下來,把開發者的 SSH 公鑰添加到這個使用者的 authorized_keys 檔案中。假設你通過電郵收到了幾個公鑰并存到了臨時檔案裡。重複一下,公鑰大緻看起來是這個樣子:
$ cat /tmp/id_rsa.john.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L
ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k
Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez
Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv
O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq
dAv8JggJICUvax2T9va5 gsg-keypair
隻要把它們逐個追加到 authorized_keys 檔案尾部即可,同時将authorized_keys設定為僅git使用者有讀寫權限。
$ cat /tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.josie.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.jessica.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
現在可以用 --bare 選項運作 git init 來建立一個裸倉庫,這會初始化一個不包含工作目錄的倉庫。
$ cd /opt/git
$ mkdir project.git
$ cd project.git
$ git --bare init
這時,Join,Josie 或者 Jessica 就可以把它加為遠端倉庫,推送一個分支,進而把第一個版本的項目檔案上傳到倉庫裡了。值得注意的是,每次添加一個新項目都需要通過 shell 登入主機并建立一個裸倉庫目錄。我們不妨以 gitserver 作為 git 使用者及項目倉庫所在的主機名。如果在網絡内部運作該主機,并在 DNS 中設定 gitserver 指向該主機,那麼以下這些指令都是可用的:
# 在 John 的電腦上
$ cd myproject
$ git init
$ git add .
$ git commit -m 'initial commit'
$ git remote add origin git@gitserver:/opt/git/project.git
$ git push origin master
這樣,其他人的克隆和推送也一樣變得很簡單:
$ git clone git@gitserver:/opt/git/project.git
$ vim README
$ git commit -am 'fix for the README file'
$ git push origin master
用這個方法可以很快捷地為少數幾個開發者架設一個可讀寫的 Git 服務。
作為一個額外的防範措施,你可以用 Git 自帶的 git-shell 工具限制 git 使用者的活動範圍。隻要把它設為 git 使用者登入的 shell,那麼該使用者就無法使用普通的 bash 或者 csh 什麼的 shell 程式。編輯/etc/passwd 檔案:
$ sudo vim /etc/passwd
在檔案末尾,你應該能找到類似這樣的行:
git:x:1000:1000::/home/git:/bin/sh
把 bin/sh 改為 /usr/bin/git-shell (或者用 which git-shell 檢視它的實際安裝路徑)。該行修改後的樣子如下:
git:x:1000:1000::/home/git:/usr/bin/git-shell
現在 git 使用者隻能用 SSH 連接配接來推送和擷取 Git 倉庫,而不能直接使用主機 shell。嘗試普通 SSH 登入的話,會看到下面這樣的拒絕資訊:
$ ssh git@gitserver
fatal: What do you think I am? A shell?
Connection to gitserver closed.
這裡提供的方法,組内所有成員對project都有讀寫權限,也就是說每個分支都可以push代碼,如果需要更加細緻的權限控制,請使用Gitosis或者Gitolite。
2. 搭建Gitweb
安裝gitweb之後就可以通過網站通路我們的項目了。就像http://git.kernel.org一樣顯示了
首先需要安裝Gitweb,如果沒有安裝apache,那麼直接安裝Gitweb,也會将apache2安裝的。
sudo apt-get install gitweb apache2
安裝完成之後,我們隻需要修改一下配置檔案,将/etc/gitweb.conf檔案中的$projectroot修改為放工程檔案的目錄。
$ vim /etc/gitweb.conf
# path to git projects (<project>.git)
$projectroot = "/opt/git";
至此gitweb就可以使用了,現在可以通過http://[git_server_IP]/gitweb通路了。
3. Push之後發送郵件通知
當組内成員push代碼到伺服器上之後,會自動發送郵件通知組内所有人員,該次push的具體内容是什麼。具體配置方法:
一般在安裝Git的時候發送郵件的腳本/usr/share/git-core/contrib/hooks/post-receive-email已經存在了,首先要修改所有者和執行權限,并且安裝sendmail。
$ sudo chown git:git post-receive-email
$ sudo chmod 755 post-receive-email
$ sudo apt-get install sendmail
然後到切換到工程目錄下的hooks中,添加 post-receive軟連結指向 /usr/share/git-core/contrib/hooks/ post-receive-email。
$ cd /opt/git/project.git/hooks
$ ln -s /usr/share/git-core/contrib/hooks/post-receive-email post-receive
最後修改工程目錄中的config檔案即可。mailinglist是郵件清單, envelopesender是發件人的郵箱,
$ vim /opt/git/project.git/config
[core]
repositoryformatversion = 0
filemode = true
bare = true
[hooks]
mailinglist = "[email protected], [email protected]" # 收件人清單
envelopesender = [email protected] # 送件人位址
emailprefix = "[Project commit] " # 郵件标題字首
showrev = "git show -C %s; echo" # 不隻顯示有變化的檔案,同時也顯示改變的内容
為了使郵件顯示的更清楚,還要修改一下工程目錄當中的description檔案,在description檔案中,預設第一行是項目名稱,是以要在第一行填入該項目的名稱,這個在郵件中會有顯示。
$ vim /opt/git/project.git/description
Project_A
我們收到郵件的标題是這樣的:
[Project commit] Project_A branch master updated. 8811b83e1afb373cbe30d5bc25683d74ace2917c
有時候我們會發現啟動和發送sendmail都相當慢,甚至要等兩三分鐘,完全不能忍,最後通過不斷的測試,解決了這個問題,主要是要修改/etc/hosts。例如我的發件人的域是example.com,hostname是desktop,那麼就應該這樣修改:
127.0.0.1 example.com localhost desktop
改完之後重新開機sendmail服務:
service sendmail restart
然後你就會發現郵件發的那是刷刷滴!
至此,我們的Git伺服器就已經搭建完成了,和你的小夥伴一起快樂的coding吧!