ubuntu上配置git服務器
這幾天來一直在折騰git版本管理服務器,感覺有點頭大,一會兒權限不夠,一會兒加密文件與用戶名不匹配……
但功夫不負有心人今天下午總是有所成效,把這些天來我所遇到和所範錯誤作一個記錄,給大家一個參考!
今天重新把日誌修改了一下,主要解決了gitweb顯示問題,與新加入的成員無法clone git倉庫的問題!
1 需求
硬件需求:一臺Ubuntu或者debian電腦(虛擬機),能通過網絡訪問到。
軟件需求:git-core, gitosis, openssh-server, openssh-client
2 安裝配置git服務器
安裝git和openssh:
a@server:~$ sudo apt-get install git-core openssh-server openssh-client
新加用戶git,該用戶將作爲所有代碼倉庫和用戶權限的管理者:
a@server:~$ sudo useradd -m git
a@server:~$ sudo passwd git
建立一個git倉庫的存儲點:
a@server:~$ sudo mkdir /home/repo
讓除了git以外的用戶對此目錄無任何權限:
a@server:~$ sudo chown git:git /home/repo
a@server:~$ sudo chmod 755 /home/repo 注:此處要把git倉庫repo的屬性設置成755,不然在gitweb中一直無法找到工程
3 安裝配置gitosis
初始化一下服務器的git用戶,這一步其實是爲了安裝gitosis做準備。在任何一 臺機器上使用git,第一次必須要初始化一下:
a@server:~$ git config –global user.name “myname”
a@server:~$ git config –global user.email “myname@server“
安裝一下python的setup tool, 這個也是爲了gitosis做準備:
a@server:~$ sudo apt-get install python-setuptools
獲得gitosis包:
a@server:~$ cd /tmp
a@server:/tmp$ git clone git://eagain.net/gitosis.git
a@server:/tmp$ cd gitosis
a@server:/tmp/gitosis$ sudo python setup.py install
切換到git用戶下:
a@server:/tmp/gitosis$ su git
默認狀態下,gitosis會將git倉庫放在 git用戶的home下,所以我們做一個鏈接到/home/repo
$ ln -s /home/repo /home/git/repositories
再次返回到默認用戶
$ exit
如果你將作爲git服務器的管理員,那麼在你的電腦上(另一臺pc)生成ssh公鑰:
usr@pc1:~$ ssh-keygen -t rsa
將公鑰拷貝到服務器的/tmp下:
usr@pc1:~$ scp .ssh/id_rsa.pub git@<server>:/tmp
回到git服務器上
a@server:/tmp/gitosis$ sudo chmod a+r /tmp/id_rsa.pub
讓gitosis運行起來:
a@server:/tmp/gitosis$ sudo -H -u git gitosis-init < /tmp/id_rsa.pub
Initialized empty Git repository in /home/repo/gitosis-admin.git/
Reinitialized existing Git repository in /home/repo/gitosis-admin.git/
gitosis的有趣之處在於,它通過一個git倉庫來管理配置文件,倉庫就放在了/home/repo/gitosis- admin.git。我們需要爲一個文件加上可執行權限:
a@server:/home/git$ sudo passwd root
a@server:/home/git$ su
root@server:/home/git# cd repositories
root@server:/home/git/repositories# cd gitosis-admin.git/
root@server:/home/git/repositories/gitosis-admin.git# sudo chmod 755 /home/repo/gitosis-admin.git/hooks/post-update
root@server:/home/git/repositories/gitosis-admin.git# exit
4 在服務器上新建一個測試項目倉庫
我們在服務器上新建一個空的項目倉庫,叫“teamwork”。
切換到git用戶:
a@server:/home/git$ su – git
$ cd /home/repo
$ mkdir teamwork.git
$ cd teamwork.git
$ git init - -bare 注:這是在服務器上運行的,是爲了初始化一個根級的git倉庫
$ exit
但是,到目前爲止,這只是一個空倉庫,空倉庫是不能clone下來的。爲了能做clone,我們必須先讓某個有權限的人放一個初始化的版本到倉庫中。
所以,我們必須先修改一下gitosis-admin.
5 管理gitosis的配置文件
剛剛提到,gitosis本身的配置也是通過git來實現的。在你自己的開發機裏,把gitosis-admin.git這個倉庫clone下來,就可以以管理員的身份修改配置了。
在你的電腦裏:
usr@pc1:~/work$ git clone git@<server>:gitosis-admin.git
usr@pc1:~/work$ cd gitosis-admin/
該目錄下的keydir目錄是用來存放所有需要訪問git服務器的用戶的ssh公鑰:
各個用戶按照前面提到的辦法生成各自的ssh公鑰文件後,把所有人的 ssh公鑰文件都拿來,按名字命名一下,比如b.pub, lz.pub等,統統拷貝到keydir下:
usr@pc1:~/work/gitosis-admin$ su root
root@pc1:/home/a/work/gitosis-admin# cp /path/to/.ssh/id_rsa.pub ./keydir/b.pub
root@pc1:/home/a/work/gitosis-admin# exit
修改gitosis.conf文件,我的配置大致如下:
[gitosis]
[group gitosis-admin]
writable = gitosis-admin
members = a@server usr@pc1
[group hello]
writable = teamwork
members = a@server b
[group hello_ro]
readonly = teamwork
members = lz
這個配置文件表達瞭如下含義:gitosis-admin組成員有a, usr,該組對gitosis-admin倉庫有讀寫權限;
team組有a,b兩個成員,該組對teamwork倉庫有讀寫權限;
team_ro組有lz一個成員,對teamwork倉庫有隻讀權限。
當然目前這些配置文件的修改只是在你的本地,你必須推送到遠程的gitserver上才能真正生效。
加入新文件、提交併push到git服務器:
usr@pc1:~/work/gitosis-admin$ git add .
usr@pc1:~/work/gitosis-admin$ git commit -am “add teamweok prj and users”
usr@pc1:~/work/gitosis-admin$ git push origin master
6 初始化測試項目
好了,現在服務器就搭建完了,並且有一個空的項目teamwork在服務器上。接下來呢?當然是測試一下,空倉庫是不能clone的,所以需要某一個有寫權限的人初始 化一個版本。就我來做吧,以下是在客戶端完成。
usr@pc1:~/work$ mkdir teamwork-ori
usr@pc1:~/work$ cd teamwork-ori/
usr@pc1:~/work/teamwork-ori$ git init 注:這是在用戶端的PC上執行的,爲的是初始化一個本地的版本庫
usr@pc1:~/work/teamwork-ori$ echo “/*add something*/” > hello
usr@pc1:~/work/teamwork-ori$ git add .
usr@pc1:~/work/teamwork-ori$ git commit -am “initial version”
usr@pc1:~/work/teamwork-ori$ git remote add origin git@<server>:teamwork.git
usr@pc1:~/work/teamwork-ori$ git push origin master
到此爲止teamwork已經有了一個版本了,team的其他成員只要先clone一下 teamwork倉庫,就可以任意玩了。
usr@pc1:~/work/teamwork-ori$ su b
$ cd /home/b
$ git clone git@<server>:teamwork.git
$ cd teamwork
$ vim hello
$ git add .
$ git commit -am “b add”
$ git push origin master
$ exit
7 添加已有git項目
另外:如果你有一個現成的git倉庫,想放到 gitserver上供team使用(比如你clone了一個官方的kernel倉庫,想在內部使用它作爲基礎倉庫),怎麼辦呢。
首先需要從你的工作倉庫中得到一個純倉庫, 比如你的工作目錄爲~/kernel, 你想導出純倉庫到你的優盤裏,然後拷貝到gitserver上去。
$ git clone –bare ~/kernel /media/udisk
然後就拿着優盤,交給gitserver的管理員,讓他拷貝到/home/repo/下,同時需要配置 gitosis相關配置文件哦,這個就不用再說了吧。比如:下載ALSA庫:
git clone git://android.git.kernel.org/platform/external/alsa-lib.git
git clone git://android.git.kernel.org/platform/external/alsa-utils.git
生成bare庫
git clone –bare alsa-lib alsa-lib.git
git clone –bare alsa-utils alsa-utils.git
將bare 庫移動到git服務器目錄
cp alsa-lib.git /home/repo
注意變更所有者,以獲取提交權限。
chown -R git alsa-lib.git
然後就O 了,呵呵.
8 創建gitweb
sudo apt-get install gitweb
如果沒有安裝apache2,請執行
sudo apt-get install apache2
8.1 配置 gitweb
默認沒有 css 加載,把 gitweb 要用的靜態文件連接到 DocumentRoot 下:
cd /var/www/
sudo ln -s /usr/share/gitweb/* .
8.2 修改配置
sudo vi /etc/gitweb.conf
將 $projectroot 改爲git倉庫存儲目錄(例如:/home/git/repositories),保存後刷新瀏覽器。
如果沒有找到項目,你需要將$projectroot/*.git 的屬性改爲755,讓apache用戶有可讀權限。可以只改你需要讓別人通過web訪問的那個git。http://localhost/cgi-bin/gitweb.cgi
8.3 修改/etc/gitweb.conf 內容
# path to git projects (<project>.git)
#$projectroot = "/var/cache/git";
$projectroot = "/home/git/repositories";
# directory to use for temp files
$git_temp = "/tmp";
# target of the home link on top of all pages
$home_link = $my_uri || "/";
# html text to include at home page
$home_text = "indextext.html";
# file with project list; by default, simply scan the projectroot dir.
$projects_list = $projectroot;
# stylesheet to use
@stylesheets = ("/gitweb/static/gitweb.css");
# javascript code for gitweb
$javascript = "gitweb/static/gitweb.js";
# logo to use
$logo = "/gitweb/static/git-logo.png";
# the 'favicon'
$favicon = "/gitweb/static/git-favicon.png";
# git-diff-tree(1) options to use for generated patches
#@diff_opts = ("-M");
@diff_opts = ();
8.4 配置apache2
ubuntu中默認的web目錄是/var/www,默認的cgi目錄是 /usr/lib/cgi-bin/,安裝完成gitweb後,gitweb的gitweb.cgi會自動放置到該目錄下。
如果你的cgi路徑不是默認的/usr/lib/cgi-bin/,需要將gitweb安裝在/usr/lib/cgi-bin中的gitweb.cgi複製到原來配置的cgi-bin路徑,並在apache的配置文件/etc/apache2/apache.conf末尾加上以下內容:
SetEnv GITWEB_CONFIG /etc/gitweb.conf
<Directory "/srv/www/cgi-bin/gitweb">
Options FollowSymlinks ExecCGI
Allow from all
AllowOverride all
Order allow,deny
<Files gitweb.cgi>
SetHandler cgi-script
</Files>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.* /gitweb.cgi/$0 [L,PT]
</Directory>
8.5 重新啓動apache
sudo /etc/init.d/apache2 restart
訪問http://localhost/cgi-bin/gitweb.cgi
說明一點:如果其它新加入的成員無法clone一個git倉庫時,如出現如下錯誤提示:
ERROR:gitosis.serve.main:Repository read access denied
原因是當前成員的key命名與在gitosis.conf中的members中的名字不一致!例如所用的key名是 lxq_rsa.pub,而在gitosis.conf中某一group下所用的名稱爲 lxq@ubuntu
則只需要把lxq_rsa.pub重命名爲[email protected]並重新push到服務器上即可!
最後奉上一個git學習網站,中文的哦 ^_^http://progit.org/book/zh/index.html