Ubuntu下git服務器搭建

參考網上資料搭建git服務器過程記錄以下:css

需求

硬件需求:一臺Ubuntu或者debian電腦(虛擬機),能經過網絡訪問到。

軟件需求:git-core, gitosis, openssh-server, openssh-client, Apache2(Gitweb)

安裝配置git服務器

 1 //安裝git和openssh:
 2 a@server:~$ sudo apt-get install git-core openssh-server openssh-client
 3 //新加用戶git, 該用戶將做爲全部代碼倉庫和用戶權限的管理者:
 4 a@server:~$ sudo useradd -m git
 5 a@server:~$ sudo passwd git
 6 //創建一個git倉庫的存儲點:
 7 a@server:~$ sudo mkdir /home/repo
 8 //讓除了git之外的用戶對此目錄無任何權限:
 9 a@server:~$ sudo chown git:git /home/repo
10 a@server:~$ sudo chmod 700 /home/repo 

安裝配置gitosis

 1 //初始化一下服務器的git用戶,這一步實際上是爲了安裝gitosis作準備。在任何一 臺機器上使用git,第一次必需要初始化一下:
 2 a@server:~$ git config –global user.name 「myname」
 3 a@server:~$ git config –global user.email 「myname@server 「
 4 //安裝一下python的setup tool, 這個也是爲了gitosis作準備:
 5 a@server:~$ sudo apt-get install python-setuptools
 6 //得到gitosis包:
 7 a@server:~$ cd /tmp
 8 a@server:/tmp$ git clone https://github.com/res0nat0r/gitosis.git
 9 a@server:/tmp$ cd gitosis
10 a@server:/tmp/gitosis$ sudo python setup.py install
11 //切換到git用戶下:
12 a@server:/tmp/gitosis$ su git
13 //默認狀態下,gitosis會將git倉庫放在 git用戶的home下,因此咱們作一個連接到/home/repo
14 $ ln -s /home/repo /home/git/repositories
15 //再次返回到默認用戶
16 $ exit
17 //若是你將做爲git服務器的管理員,那麼在你的電 腦上(另外一臺pc)生成ssh公鑰:
18 usr@pc1:~$ ssh-keygen -t rsa
19 將公鑰拷貝到服務器的/tmp下:
20 usr@pc1:~$ scp .ssh/id_rsa.pub git@<server>:/tmp
21 //回到git服務器上
22 a@server:/tmp/gitosis$ sudo chmod a+r /tmp/id_rsa.pub
23 //讓gitosis運行起來:
24 a@server:/tmp/gitosis$ sudo -H -u git gitosis-init < /tmp/id_rsa.pub
25 Initialized empty Git repository in /home/repo/gitosis-admin.git/
26 Reinitialized existing Git repository in /home/repo/gitosis-admin.git/
27 //gitosis的有趣之處在於,它經過一個git倉庫來管理配置文件,倉庫就放在了/home/repo/gitosis- admin.git。咱們須要爲一個文件加上可執行權限:
28 a@server:/home/git$ sudo passwd root
29 a@server:/home/git$ su
30 root@server:/home/git # cd repositories
31 root@server:/home/git/repositories # cd gitosis-admin.git/
32 root@server:/home/git/repositories/gitosis-admin.gi t # sudo chmod 755 /home/repo/gitosis-admin.git/hooks/post-update
33 
34 root@server:/home/git/repositories/gitosis-admin.git # exit

在服務器上新建一個測試項目倉庫

我建了一個叫「teamwork」的倉庫。
切換到git用戶:
python

1 a@ubuntu:/home/git$ su - git
2 $ cd /home/prj_git
3 $ mkdir teamwork.git
4 $ cd teamwork.git
5 $ git init --bare
6 $ exit
可是,到目前爲止,這只是一個空倉庫,空倉庫是不能clone下來的。爲了能作clone,咱們必須先讓某個有權限的人放一個初始化的版本到倉庫中。
因此,咱們必須先修改一下gitosis-admin.

管理gitosis的配置文件

剛剛提到,gitosis自己的配置也是經過git來實現的。在你本身的開發機裏,把gitosis-admin.git這個倉庫clone下來,就能夠以管理員的身份修改配置了。linux

在你的電腦裏:

  1 usr@pc1:~/work$ git clone git@<server>:gitosis-admin.git  
 
若是出現:
fatal: '~/gitosis-admin.git' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
改爲:
1 usr@pc1:~/work$ sudo git clone git@<Server-IP>:/home/prj_git/gitosis-admin.git
2 usr@pc1:~/work$ cd gitosis-admin/ 
該目錄下的keydir目錄是用來存放全部須要訪問git服務器的用戶的ssh公鑰:
各個用戶按照前面提到的辦法生成各自的ssh公鑰文件後, 把全部人的 ssh公鑰文件都拿來,按名字命名一下,好比b.pub, lz.pub等,通通拷貝到keydir下:
1 usr@pc1:~/work/gitosis-admin$ su root
2 root@server:/home/a/work/gitosis-admin # cp /path/to/.ssh/id_rsa.pub ./keydir/b.pub
3 root@server:/home/a/work/gitosis-admin # exit 
修改gitosis.conf文件,個人配置大體以下:
 1     [gitosis]
 2     [group gitosis-admin]
 3     writable = gitosis-admin
 4     members = a@server usr@pc1
 5     [group hello]
 6     writable = teamwork
 7     members = a@server b
 8     [group hello_ro]
 9     readonly = teamwork
10     members = lz
這個配置文件表達了以下含義:gitosis-admin組成員有a, usr,該組對gitosis-admin倉庫有讀寫權限;
team組有a,b兩個成員,該組對teamwork倉庫有讀寫權限;
team_ro組有lz一個成員,對teamwork倉庫有隻讀權限。

固然目前這些配置文件的修改只是在你的本地,你必須推送到遠程的gitserver上才能真正生效。
加入新文件、提交併push到git服務器:
1 usr@pc1:~/work/gitosis-admin$ git add .
2 usr@pc1:~/work/gitosis-admin$ git commit -am 「add teamweok prj and users」
3 usr@pc1:~/work/gitosis-admin$ git push origin master

初始化測試項目

好了,如今服務器就搭建完了,而且有一個空的項目teamwork在服務器上。接下來呢?固然是測試一下,空倉庫是不能clone的,因此須要某一個有寫權限的人初始 化一個版本。就我來作吧,如下是在客戶端完成。
1 usr@pc1:~/work$ mkdir teamwork-ori
2 usr@pc1:~/work$ cd teamwork-ori/
3 usr@pc1:~/work/teamwork-ori$ git init
4 usr@pc1:~/work/teamwork-ori$ echo/*add something*/」 > hello
5 usr@pc1:~/work/teamwork-ori$ git add .
6 usr@pc1:~/work/teamwork-ori$ git commit -am 「initial version」
7 usr@pc1:~/work/teamwork-ori$ git remote add origin git@<server>:teamwork.git
8 usr@pc1:~/work/teamwork-ori$ git push origin master 
到此爲止teamwork已經有了一個版本了,team的其餘成員只要先clone一下 teamwork倉庫,就能夠任意玩了。
1 usr@pc1:~/work/teamwork-ori$ su b
2 $ cd /home/b
3 $ git clone git@<server>:teamwork.git
4 $ cd teamwork
5 $ vim hello
6 $ git add .
7 $ git commit -am 「b add」
8 $ git push origin master
9 $ exit 

添加已有git項目

另外:若是你有一個現成的git倉庫,想放到 gitserver上供team使用(好比你clone了一個官方的kernel倉庫,想在內部使用它做爲基礎倉庫),怎麼辦呢。
 1 //首先須要從你的工做倉庫中獲得一個純倉庫, 好比你的工做目錄爲~/kernel, 你想導出純倉庫到你的優盤裏,而後拷貝到gitserver上去。
 2 $ git clone –bare ~/kernel /media/udisk
 3 //而後就拿着優盤,交給gitserver的管理員,讓他拷貝到/home/repo/下,同時須要配置 gitosis相關配置文件哦,這個就不用再說了吧。好比:下載ALSA庫:
 4 git clone git://android.git.kernel.org/platform/external/alsa-lib.git
 5 git clone git://android.git.kernel.org/platform/external/alsa-utils.git
 6 //生成bare庫
 7 git clone –bare alsa-lib alsa-lib.git
 8 git clone –bare alsa-utils alsa-utils.git
 9 //將bare 庫移動到git服務器目錄
10 cp alsa-lib.git /home/repo
11 //注意變動全部者,以獲取提交權限。
12 chown -R git alsa-lib.git 

配置gitweb

1. 安裝gitweb  android

   sudo apt-get install gitweb 

2. 安裝apache2git

  sudo apt-get install apache2

3. 配置gitweb
(1)默認沒有 css 加載,把 gitweb 要用的靜態文件鏈接到 DocumentRoot 下:github

1    cd /var/ www/
2    sudo ln -s / usr/ share/ gitweb/* . 

   (注意後面的點)web

(2)修改配置:
apache

 sudo vi /etc/ gitweb.conf

   將 $projectroot 改成gitosis-admin.git所在目錄: /home/git/repositoriesubuntu

 (3)修改 /home/git/repositories權限,默認狀況下,gitosis將 repositories權限設置爲不可讀的  
vim

 sudo chmod 777 -R /home/git/repositories

11.編輯apache2配置文件,創建web站點 (默認狀況下能夠忽略此步驟)

(1) 編輯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
    gitweb.conf配置文件形如:(可自行修改,這裏不作詳細介紹)

 1 <Directory "/srv/www/cgi-bin/gitweb">          
 2       Options FollowSymlinks ExecCGI         
 3       Allow from all                         
 4       AllowOverride all                      
 5       Order allow,deny                       
 6 
 7       <Files gitweb.cgi>
 8            SetHandler cgi-script
 9       </Files>                   
10       RewriteEngine on
11       RewriteCond %{REQUEST_FILENAME} !-f
12       RewriteCond %{REQUEST_FILENAME} !-d
13       RewriteRule ^.* /gitweb.cgi/$0 [L,PT]
14 </Directory>

(2)從新啓動apache:sudo /etc/init.d/apache2 restart,訪問http://localhost/cgi-bin/gitweb.cgi

 

配置web訪問方式:

Apache經常使用命令:
a2dissite gitserver 禁用
a2ensite gitserver  使能
/etc/init.d/apache2 restart 重啓
1.apt-get install apache2
2.手動安裝gitweb
1 git clone git://git.kernel.org/pub/scm/git/git.git
2 cd git
3 make GITWEB_PROJECTROOT=」/home/repo」 prefix=/usr gitweb/gitweb.cgi
4 cd gitweb
5 cp -av git* /home/repo/
3.vim /etc/apache2/sites-available/gitserver
 1 <VirtualHost 172.20.146.39:80>
 2 ServerName 172.20.146.39
 3 DocumentRoot /home/repo
 4 ScriptAlias /cgi-bin/ /home/repo
 5 <Directory /home/repo>
 6 Options ExecCGI +FollowSymLinks +SymLinksIfOwnerMatch
 7 AllowOverride All
 8 order allow,deny
 9 Allow from all
10 AddHandler cgi-script cgi
11 DirectoryIndex gitweb.cgi
12 </Directory>
13 </VirtualHost>
4.賦予權限,很重要:
1 chgrp -R www-data /home/repo
2 chmod a+r repo
3 chmod a+x repo
4 mv hooks/post-update.sample hooks/post-update 
5.a2ensite gitserver
6./etc/init.d/apache2 restart
匿名訪問方式:
1 git clone http://192.168.1.1/alsa-lib.git
2 git clone http://192.168.1.1/alsa-utils.git 
git訪問方式:
1 git clone git@192.168.1.1:alsa-lib.git 
Web網頁瀏覽:
http://192.168.1.1
遇到的問題:
1.windows文件命名不區分大小 寫,而linux支持。這樣android源碼下載時會出現一下問題。大約有15個文件存在這個問題。
2.庫的描述文件在.git文件夾的description文件中。編輯該文件,在gitweb頁中就會有 description。
3.gitosis庫hooks下的post- update不是由post-update.sample重命名過來的,它們不同。post-update能夠更新工做目錄,保持與庫一致。沒有它配置 文件是不會更新的。
4.(1)git@hello:/home/git$ git add .
error: readlink(「external/openssl/apps/md4.c」): No such file or directory
error: unable to index file external/openssl/apps/md4.c
fatal: adding files failed
(2)root@/external/openssl# git init
Initialized empty Git repository in /external/openssl/.git/
root@/external/openssl # git add .
error: readlink(「apps/md4.c」): No such file or directory
error: unable to index file apps/md4.c
fatal: adding files failed
(3) root@android-2.1_r2$ rm -Rf .repo
root@android-2.1_r2 $ find . -name 「.git」 | xargs rm -Rf 
相關文章
相關標籤/搜索