ubuntu上配置git服務器 -增加apache2安裝方法

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章