天天看點

Git配置手冊

Git伺服器配置

1.部署環境:

(1)系統版本:CentOS 5.5

(2)服務端 IP:172.16.34.235   Hostname:CentOS5-A

     用戶端1 IP:172.16.34.236  Hostname:CentOS5-B

     用戶端2 IP:172.16.34.237  Hostname:CentOS5-C

(3)所需包下載下傳位址:

    wget http://www.python.org/ftp/python/2.7.1/Python-2.7.1.tar.bz2

    wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz

    wget http://www.codemonkey.org.uk/projects/git-snapshots/git/git-latest.tar.gz

2. python 安裝

----------------

檢視python版本

python -V 

顯示結果:

Python 2.4.3

更新到Python 2.7.1

cd /data/softs

tar xvjf Python-2.7.1.tar.bz2

cd Python-2.7.1/

./configure --enable-shared

make

make install

ldconfig

3.setuptools 安裝 為安裝gitosis做準備

tar -zxvf setuptools-0.6c11.tar.gz

cd setuptools-0.6c11

python setup.py build

python setup.py install

4.Git 安裝

首先需要安裝git的依賴包

 yum install curl

 yum install curl-devel

 yum install zlib-devel

 yum install openssl-devel

 yum install perl

 yum install cpio

 yum install expat-devel

 yum install gettext-devel

tar -zxvf git-latest.tar.gz

cd git-2012-11-13

autoconf

./configure --with-python=/usr/local/bin/python2.7

git --version

5.添加使用者git

useradd -r -s /bin/sh -c 'git version control' -d /home/git git

passwd git

mkdir -p /home/git

chown git:git /home/git

注:步驟2-5  三台機器上均需要安裝

6.安裝gitosis(服務端)

git clone git://github.com/res0nat0r/gitosis.git

Cloning into 'gitosis'...

remote: Counting objects: 727, done.

remote: Compressing objects: 100% (217/217), done.

remote: Total 727 (delta 510), reused 690 (delta 494)

Receiving objects: 100% (727/727), 110.70 KiB | 53 KiB/s, done.

Resolving deltas: 100% (510/510), done.

cd gitosis

7.生成本機密鑰,上傳密鑰到伺服器臨時目錄

(1)切換到用戶端1

# su git

sh-3.2$ ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/home/git/.ssh/id_rsa):

Created directory '/home/git/.ssh'.

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /home/git/.ssh/id_rsa.

Your public key has been saved in /home/git/.ssh/id_rsa.pub.

The key fingerprint is:

50:93:2a:dd:50:b2:dd:c2:aa:a6:f9:a6:9f:55:82:b9 git@CentOS5-B

sh-3.2$  scp /home/git/.ssh/id_rsa.pub 172.16.34.235:/tmp/id_rsa_client1.pub

The authenticity of host '172.16.34.235 (172.16.34.235)' can't be established.

RSA key fingerprint is 0f:92:64:29:ab:02:4a:33:b2:8b:39:b4:8f:0d:88:40.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '172.16.34.235' (RSA) to the list of known hosts.

[email protected]'s password:

id_rsa.pub                                              100%  395     0.4KB/s   00:00   

sh-3.2$

(2)用戶端2作同樣操作

8.初使化gitosis,生成管理庫

sh-3.2$ gitosis-init </tmp/id_rsa_client1.pub

看到如下提示說明安裝成功

Initialized empty Git repository in /home/git/repositories/gitosis-admin.git/

Reinitialized existing Git repository in /home/git/repositories/gitosis-admin.git/

執行初始化指令會生成兩個檔案夾如下:

sh-3.2$ls /home/git/

gitosis  keys  repositories

gitosis作用在于,它通過一個git倉庫來管理配置檔案,倉庫就放在了/home/git/repositorie/gitosis-admin.git

為檔案加上可執行權限:

sh-3.2$chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update

使用git之前必須要設定2個全局變量

git config --global user.email "[email protected]"

git config --global user.name "hanxiaoqi"

這個将設定在你的home目錄下,預設是在~/.gitconfig裡

9.測試

為了測試添加新使用者:

用戶端1 添加使用者useradd song,生成key密鑰(/home/song/.ssh/id_rsa.pub)

用戶端2 添加使用者useradd hanxiaoqi,生成key密鑰(/home/hanxiaoqi/.ssh/id_rsa.pub)

在用戶端1上執行:

#su git

sh-3.2$ cd /home/git

sh-3.2$ git clone [email protected]:gitosis-admin.git

Cloning into 'gitosis-admin'...

remote: Counting objects: 17, done.

remote: Compressing objects: 100% (16/16), done.

Receiving objects: 100% (17/17), done.

Resolving deltas: 100% (1/1), done.

remote: Total 17 (delta 1), reused 5 (delta 0)

sh-3.2$ ls

gitosis-admin

sh-3.2$ cd gitosis-admin/keydir/

現在把生成的ssh公鑰檔案都複制到/home/git/gitosis-admin/keydir,按名字命名一下,比如hanxiaoqi.pub, song.pub等

[email protected]  [email protected]  hanxiaoqi.pub  song.pub

sh-3.2$ cd ..

sh-3.2$ vi gitosis.conf

------------------

[gitosis]

[group gitosis-admin]

members = git@CentOS5-B git@CentOS5-C hanxiaoqi song

writable = gitosis-admin

[group project]

writable = project

members = git@CentOS5-B git@CentOS5-C hanxiaoqi

[group project_ro]

readonly = project

members = song

-------------------------

這個配置檔案表達了如下含義:gitosis-admin組成員有git@CentOS5-B git@CentOS5-C hanxiaoqi song,該組對gitosis-admin倉庫有讀寫權限;

project組有git@CentOS5-B git@CentOS5-C hanxiaoqi三個成員,該組對project倉庫有讀寫權限;

project_ro組有song一個成員,對project倉庫有隻讀權限。

當然目前這些配置檔案的修改隻是在你的本地,你必須推送到遠端的git server上才能真正生效。

加入新檔案、送出并push到git伺服器:

sh-3.2$ git add .

sh-3.2$ git commit -am "user add"

[master db3fe31] user add

 5 files changed, 4 insertions(+), 2 deletions(-)

 delete mode 160000 gitosis-admin2

 create mode 100644 keydir/[email protected]

 create mode 100644 keydir/hanxiaoqi.pub

 create mode 100644 keydir/song.pub

sh-3.2$ git push origin master

Counting objects: 10, done.

Compressing objects: 100% (7/7), done.

Writing objects: 100% (7/7), 1.50 KiB, done.

Total 7 (delta 0), reused 0 (delta 0)

To [email protected]:gitosis-admin.git

   13e345b..db3fe31  master -> master

回到服務端:

cat /home/git/.ssh/authorized_keys

sh-3.2$ cat authorized_keys

### autogenerated by gitosis, DO NOT EDIT

command="gitosis-serve hanxiaoqi",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA02vPejh7OfzHtFc3dlA+k55X9kttJ/8WgK2YiXObAElXJ+CAzZKayciUfbY4A3Xl55kVVPnYhvfxdndBWXAj2za8iSCW535XMgFBXH/gtD2+Ecql2oUu0TOoAldgZ6jJ03hon+B0T4znWZTmfNKY4GauWgj65Z+ex+VZoO357089mTGMnoOZx1sblC+7vr9TnFoSh1hOqdYlaBjvB8BtcXrU4OVbZphPE1BxmT6OSDWx677M157uWsyZFxH5ocr8hqZ88+zpVZe1i5VEZpnXETHlXb6Ix/4mEutscJ5WGWjZEJgUNGv+jYTSvtDS+7z/A9ot93kze46RxPFuRB6Cyw== hanxiaoqi@CentOS5-C

command="gitosis-serve song",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqhgzC2oi8JrYNZcyZ//ojddJCqalKJ0mBtMCfq9VEHPh0YjaZqdNd4HeqHrtFoRe3C+6zQwqAesd+q01gMyOTAyAI76d5b4j81MNCyvGbzbhzc/xOOxCpnT9H5ZKoChzoh88Tah1pjsZDW6spBHW/HRtaLRKB3k6fAGyctE5heJJUqGOknnDfzw+ZyzfFxynNiYvgDgWW5MfALFz/ltzo41QwL30Lfj6ZuHF2kV4Olc7jK1vHzm0/riU3a6BeYf5NAmATNlP94QbThUBdq/MpKJ7OFDXCNXuFBBJ9RANtwA3m8pFb48cZ4ebuMfd8YQ0I2Rb+OvVxVDT0XGYU/uNAw== song@CentOS5-B

command="gitosis-serve git@CentOS5-C",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA0pO/1EcLPBZOL8zPASs85srQGBz4QHv3aV0SR/zJw/ViuUwY8toMtRp0OsQ8VaqqkP3RIh6J49ZgtmDnbrrcLIkpnTgHEqU+s7WoHmZWnttMEYs8aMoSvFT5pxR9k54baHKaA2TmUtTmCJnVCqPx2uSP5tb+Cww18dj9+LzdJ/fCllcwuGfg9z0G8seedgq/Iv22XIMH045ciUNC7P02kSq2tjCctJtDtP8Cb2MYhurySOVBqjAx+GISrXJXUqRI1Gsr1CjlxazsoRwnHUz217btE+xnpwkQ7lxPMNyPS2fMbR+chU/Pg7Yfx43xxhePhsPqCmYFLaX87gyBRV/GVw== git@CentOS5-C

command="gitosis-serve git@CentOS5-B",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA1o68X0/pVW3HM3CZTZhSASOhjj3lI1s0Txzt8Yg1NoEVY/NAW7oFCENxu0Wg2Cxrb93w0HfSTHb/2dXtzhzb4Oq7XaxDYpy+i5M3y1xiQkZoqL30qh7n++RWjpMwObgs00PzcV4kiZ+UCU2gnDlJl+t8rc6CwlEcphoN9IPexiGUJIeJeRWA0c+BGJH0ds3I/D+TGX3Jr92R7k2zsn3pmD6i9px6EtDK/QKFzPnnBQ9psCRiHJk3qu33sghJuUlp7vQU6zKylxMZ9ypevo9nJnA/gUf0PLQKSgvj39/k5PIGVrLOt4o3xu/Z8PeM/dd8cpDEd3hHhFmw+Y0Ev+CaXw== git@CentOS5-B

到此用戶端使用者公鑰已經添加到/home/git/.ssh/authorized_keys檔案中。

10.建立空倉庫

在服務端建立空倉庫,并初始化。

sh-3.2$ cd /home/git/repositories/

sh-3.2$ mkdir project.git

sh-3.2$ cd project.git/

sh-3.2$ git init --bare

Initialized empty Git repository in /home/git/repositories/project.git/

branches  config  description  HEAD  hooks  info  objects  refs

在用戶端直接clone該倉庫就可以了

1.用戶端1:

切換到git使用者

sh-3.2$ git clone [email protected]:project.git

Cloning into 'project'...

warning: You appear to have cloned an empty repository.

gitosis-admin  project

sh-3.2$ cd project/

sh-3.2$ vi hello

編輯檔案

-----------------

hello

--------------------

sh-3.2$ git commit -am "add hello file"

[master (root-commit) 8c6f80f] add hello file

 1 file changed, 1 insertion(+)

 create mode 100644 hello

Counting objects: 3, done.

Writing objects: 100% (3/3), 214 bytes, done.

Total 3 (delta 0), reused 0 (delta 0)

To [email protected]:project.git

 * [new branch]      master -> master

2.用戶端2:

切換到hanxiaoqi使用者

[root@CentOS5-C home]# su hanxiaoqi

[hanxiaoqi@CentOS5-C home]$ pwd

/home

[hanxiaoqi@CentOS5-C home]$ cd hanxiaoqi/

[hanxiaoqi@CentOS5-C ~]$ ls

[hanxiaoqi@CentOS5-C ~]$ pwd

/home/hanxiaoqi

[hanxiaoqi@CentOS5-C ~]$ git clone [email protected]:project.git

正克隆到 'project'...

remote: Counting objects: 3, done.

remote: Total 3 (delta 0), reused 0 (delta 0)

接收對象中: 100% (3/3), done.

project

[hanxiaoqi@CentOS5-C ~]$ cd project/

[hanxiaoqi@CentOS5-C project]$ ls

[hanxiaoqi@CentOS5-C project]$ vi hello2

hello2

~

"hello2" [新] 1L, 7C 已寫入                                                         

hello  hello2

[hanxiaoqi@CentOS5-C project]$ git add .

[hanxiaoqi@CentOS5-C project]$ git commit -am "add hello2 file by hanxiaoqi"

*** Please tell me who you are.

Run

  git config --global user.email "[email protected]"

  git config --global user.name "Your Name"

to set your account's default identity.

Omit --global to set the identity only in this repository.

fatal: empty ident name (for <hanxiaoqi@CentOS5-C.(none)>) not allowed

[hanxiaoqi@CentOS5-C project]$ git config --global user.email "[email protected]"

[hanxiaoqi@CentOS5-C project]$ git config --global user.name "hanxiaoqi"

[master fd9c5fa] add hello2 file by hanxiaoqi

 create mode 100644 hello2

[hanxiaoqi@CentOS5-C project]$ git push origin master

Counting objects: 4, done.

Compressing objects: 100% (2/2), done.

Writing objects: 100% (3/3), 278 bytes, done.

   8c6f80f..fd9c5fa  master -> master

[hanxiaoqi@CentOS5-C project]$

3.用戶端1:

切換到song使用者

[root@CentOS5-B .ssh]# su song

[song@CentOS5-B .ssh]$ cd /home/song

[song@CentOS5-B ~]$ ls

[song@CentOS5-B ~]$ git clone [email protected]:project.git

remote: Counting objects: 6, done.

remote: Compressing objects: 100% (3/3), done.

remote: Total 6 (delta 0), reused 0 (delta 0)

接收對象中: 100% (6/6), done.

[song@CentOS5-B ~]$ cd project/

[song@CentOS5-B project]$ ls

[song@CentOS5-B project]$ vi hello3

hello3

"hello3" [新] 1L, 7C 已寫入                                                         

[song@CentOS5-B project]$ git add .

[song@CentOS5-B project]$ git commit -am "add hello3 file by song"

fatal: empty ident name (for <song@CentOS5-B.(none)>) not allowed

[song@CentOS5-B project]$ git config --global user.email "[email protected]"

[song@CentOS5-B project]$ git config --global user.name "hanxiaoqi"

[master f645290] add hello3 file by song

 create mode 100644 hello3

[song@CentOS5-B project]$ git push origin master

ERROR:gitosis.serve.main:Repository write access denied

fatal: Could not read from remote repository.

Please make sure you have the correct access rights

and the repository exists.

[song@CentOS5-B project]$

4.用戶端2

[root@CentOS5-C home]# su git

sh-3.2$ cd /home/git/

sh-3.2$ cd gitosis-admin/

gitosis.conf  keydir

sh-3.2$ vi gitosis.conf 開通song使用者寫權限

#[group project_ro]

#readonly = project

#members = song

"gitosis.conf" 11L, 256C written

sh-3.2$ git commit -am "user song writer"

[master 1c80b8d] user song writer

 1 file changed, 4 insertions(+), 4 deletions(-)

Counting objects: 5, done.

Compressing objects: 100% (3/3), done.

Writing objects: 100% (3/3), 361 bytes, done.

Total 3 (delta 1), reused 0 (delta 0)

To [email protected]:/gitosis-admin.git

   e1503c4..1c80b8d  master -> master

5.回到用戶端1到song使用者

再次執行:

Writing objects: 100% (3/3), 304 bytes, done.

   fd9c5fa..f645290  master -> master

11.viewgit

viewGit 是一個 Git 版本控制系統的 Web 接口,用來檢視資源庫中的資訊,viewGit 安裝和更新都非常簡單。

首先安裝nginx+php,因為viewgit是php環境開發

viewGit安裝

[root@CentOS5-A repositories]# git clone git://repo.or.cz/viewgit.git

Cloning into 'viewgit'...

remote: Counting objects: 1675, done.

remote: Compressing objects: 100% (503/503), done.

remote: Total 1675 (delta 1114), reused 1675 (delta 1114)

Receiving objects: 100% (1675/1675), 1.30 MiB | 5 KiB/s, done.

Resolving deltas: 100% (1114/1114), done.

[root@CentOS5-A repositories]# cd viewgit/

[root@CentOS5-A viewgit]# ls

default.css  favicon.png  inc        light.css  templates

doc          p_w_picpaths       index.php  plugins

将viewgit檔案夾所有内容複制到網站根目錄(/data/htdocs/www)

[root@CentOS5-A viewgit]# cd /data/htdocs/www

[root@CentOS5-A www]# ls

default.css  favicon.png  inc         index.php  plugins    viewgit

doc          p_w_picpaths       index.html  light.css  templates  viewgit.tag.gz

[root@CentOS5-A www]# cd inc

[root@CentOS5-A inc]# ls

auth_drupal_user.php  config.php               functions.php

auth_simple.php       example-localconfig.php  plugins.php

[root@CentOS5-A inc]# cp config.php localconfig.php

[root@CentOS5-A inc]# vi localconfig.php

查找到以下内容:

$conf['projects'] = array(

        // 'name' => array('repo' => '/path/to/repo/.git'), // path to GIT_DIR

);

更改為:

$conf['projects'] = array();

$git_repos_path = '/home/git/repositories';

$git_repos_folders = scandir($git_repos_path);

foreach ($git_repos_folders as $folder) {

  if (preg_match('/^.*\.git$/', $folder) === 1) {

    $conf['projects'][$folder] = array('repo' => $git_repos_path . '/' . $folder);

  }

}

建立倉庫描述檔案

[root@CentOS5-A www]# cd /home/git/

[root@CentOS5-A git]# ls

gitosis  id_rsa.pub  keys  repositories

[root@CentOS5-A git]# cd repositories/

[root@CentOS5-A repositories]# ls

gitosis-admin.git  project.git  viewgit

[root@CentOS5-A repositories]# cd project.git/

[root@CentOS5-A project.git]# ls

[root@CentOS5-A project.git]# cat description

project 1.0 by hanxiaoqi

[root@CentOS5-A project.git]#

測試:

在浏覽器裡通路http://172.16.34.235

顯示如下如果:

Project Description Last Commit Last Change Actions

gitosis-admin.git gitosis-admin manage all project's user permissions.  add git237.pub 2012-11-15 06:26 tree tar/gz zip

project.git project 1.0 by hanxiaoqi  new file hello3 2012-11-16 04:34 tree tar/gz zip

ViewGit