Ubuntu安装git服务器
fulinux
开发环境 |
Ubuntu 13.10 |
代码服务器 |
git |
1、安装git和openssh
[ruizhe@ubuntu ~]$ sudo apt-get install git-core openssh-server openssh-client
2、管理员账户是ruizhe,添加其他几个用户:fulinux,xudinchao,yaogang,chensaiping,例如:
[ruizhe@ubuntu ~]$ sudo adduser fulinux
3、同时我们创建一个git用户,专门用来管理git仓库。
[ruizhe@ubuntu ~]$ sudo adduser git
4、我们将磁盘另一个分区ext4格式后挂载到/home/git目录下,这样代码仓库就会有很大的空间,同时即便系统崩溃也不会影响数据,以便恢复。
[ruizhe@ubuntu ~]$ mkfs.ext4 /dev/sda6
[ruizhe@ubuntu ~]$ sudo vim /etc/fstab
/dev/sda6 /home/git ext4 defaults 0 0
[ruizhe@ubuntu ~]$ sudo mount -a
[ruizhe@ubuntu ~]$ cd /home/git/
[ruizhe@ubuntu git]$ ls
lost+found
#这个文件不用管它
5、因为只有管理员锐哲才有sudo的使用权,为了方便我们这里将git用户配置成也具有使用sudo的权利。
[ruizhe@ubuntu ~]$ sudo vim /etc/sudoers
# User privilege specification
root ALL=(ALL:ALL) ALL
git ALL=(ALL:ALL) ALL
#git用户使用sudo时要输入的密码是git账号的密码。
6、我们使用git登陆
git@ubuntu:~$ pwd
/home/git
git@ubuntu:~$ cd ..
git@ubuntu:/home$ ll
drwxr-xr-x 4 root root 4096 3月 5 14:39 git/
git@ubuntu:/home$ sudo chown -hR git:git git/
drwxr-xr-x 4 git git 4096 3月 5 14:39 git/
git@ubuntu:/home$ cd git/
git@ubuntu:~$ ll
drwxr-xr-x 8 git git 4096 3月 5 14:41 gitosis/
7、安装Gitosis程序。Gitosis是一个工具程序,可以帮助我们进行Git仓库的访问控制和远程管理。
git@ubuntu:~$ sudo apt-get install python-setuptools
git@ubuntu:~$ sudo git clone https://github.com/res0nat0r/gitosis.git
git@ubuntu:~$ ls
gitosis lost+found
git@ubuntu:~$ cd gitosis/
git@ubuntu:~/gitosis$ sudo python setup.py install
8、我们这里授权fulinux为git服务器的管理者,我们需要做如下工作。下面我们用fulinux账号来登录:
[fulinux@ubuntu ~]$ pwd
/home/fulinux
9、这里要强调一点每一个git用户使用之前都要做如下工作:
[chensaiping@ubuntu gitosis-admin]$ git config --global user.name "fulinux"
[chensaiping@ubuntu gitosis-admin]$ git config --global user.email [email protected]
10、获取私钥和密钥,生成密钥的过程中一路回车就行了。
[fulinux@ubuntu ~]$ ssh-keygen
[fulinux@ubuntu ~]$ ls .ssh/
id_rsa id_rsa.pub known_hosts
Id_rsa是私钥,id_rsa_pub是公钥。
11、我们将fulinux生成的公钥发送给git用户:
[fulinux@ubuntu ~]$ scp .ssh/id_rsa.pub [email protected]:/home/git
或者:
[fulinux@ubuntu ~]$ scp .ssh/id_rsa.pub git@ubuntu:/home/git
12、下面我们到git用户中去:
git@ubuntu:~$ pwd
/home/git
git@ubuntu:~$ ls
gitosis id_rsa.pub lost+found
git@ubuntu:~$ cd gitosis/
git@ubuntu:~/gitosis$ sudo -H -u git gitosis-init < ../id_rsa.pub
初始化空的 Git 版本库于 /home/git/repositories/gitosis-admin.git/
重新初始化现存的 Git 版本库于 /home/git/repositories/gitosis-admin.git/
git@ubuntu:~/gitosis$
git@ubuntu:~/gitosis$ cd ..
git@ubuntu:~$ ls
gitosis id_rsa.pub lost+found repositories
git@ubuntu:~$ cd repositories/gitosis-admin.git/
git@ubuntu:~/repositories/gitosis-admin.git$ vim gitosis.conf
[gitosis]
[group gitosis-admin]
members = fulinux@ubuntu
writable = gitosis-admin
说明fulinux@ubuntu是git库的管理者。
这里面的fulinux@ubuntu是上面fulinux生成的公钥文件中后面的字符串:
[fulinux@ubuntu ~]$ vim .ssh/id_rsa.pub
AAAAB3NzaC1yc2EAAAADAQABAAABAQDFxVgIPf+YgXNGMn4Y8+x75m0qiJjnDO6usEUncPquazwvJ5nLQyL189a4nT/ZN+
GlC8XkgFPfhVd2VXBepkuExxmUoWMlOJcV4Uaxo5/bCLA5viat6qBj2DDoj9aTSEguDNj4qES9P+rINc0w479iSFcRgoA+
WM2AryXHR7SqVlhZDoAR3kfy3Zh67uOLn0anGR9p4JfG0gYahro4oEgFUsfmwlU4UzXYrFW4sCr8u9lwAz2EOouKRp7EhpzjzCZFGNlni/
6j93sOWdW0UuBPiKmlZArkDj6O3YcZa6EqJkJmUSk+CiEkcejjkE0PtuctlpdH+79B6fjA3nmzQ/zt fulinux@ubuntu
13、修改一个文件的权限:
git@ubuntu:~$ chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update
14、这时候我们将/home/git/repositories(仓库)目录中的gitosis-admin.git克隆到fulinux用户中去,gitosis-admin.git这个是专门用来管理git用户的信息的。因为这个时候fulinux已经是git的管理员了。
[fulinux@ubuntu ~]$ pwd
/home/fulinux
[fulinux@ubuntu ~]$ git clone git@ubuntu:gitosis-admin.git
正克隆到 'gitosis-admin'...
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 0), reused 5 (delta 0)
接收对象中: 100% (5/5), done.
Checking connectivity... done
[fulinux@ubuntu ~]$ ls
gitosis-admin
正是因为前面我们使用了公钥,这里我们就无需输入密码,并且获得了管理员的权限。但是在另一个用户上会出现什么呢?
15、添加管理员。
我们在chensaiping用户上测试一下:
[chensaiping@ubuntu gitosis-admin]$ git config --global user.name "chensaiping"
[chensaiping@ubuntu gitosis-admin]$ git config --global user.email [email protected]
[chensaiping@ubuntu ~]$ pwd
/home/chensaiping
[chensaiping@ubuntu ~]$ git clone git@ubuntu:gitosis-admin.git
正克隆到 'gitosis-admin'...
git@ubuntu's password:
fatal: 'gitosis-admin.git' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
[chensaiping@ubuntu ~]$
上面我们看见用chensaiping账户,需要输入密码,但是因为没有授予管理员的权限,还是不能克隆gitosis-admin.git目录。
16、下面我们对chensaiping用户进行授权:
a) 首先生成密钥文件
[chensaiping@ubuntu ~]$ ssh-keygen
可以全部回车。
查看公钥后面的字符串:
[chensaiping@ubuntu ~]$ cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCa58XwhAk8TVIZQLsjIYUwSUcuZrLIB++TolYI9/+EsnAqY2j9sXqzUzPP9I6h2kQ/AYKV7lUPrHg8v4I7WhjaGSYJtY/JSN1ubclkTzKobQ83j8BMd7Nnoa5rjcRl8kv07FIeyY7hMb03DLFQJ4sM3oSV4ryuzIcrnPR3czj37PICB8hbv+jBMy2YEZze4xuqy2ioiyGqXkW5XX0T69lqxMtuVBzP1OZEE5uPtfFi/GX+gVE4UTnayjGkouPIK9kLbKojge2Y3KtCB9JcU2KjPdEbRt45eaBkppSD18h6E3KIhxPaJJJFK1EuQpsecGNRh6iNY4OWXSufasloC5Sj chensaiping@ubuntu
在管理员fulinux用户中,将chensaiping@ubuntu添加到git的管理员成员列表中去:
[fulinux@ubuntu ~]$ pwd
/home/fulinux
[fulinux@ubuntu ~]$ vim gitosis-admin/gitosis.conf
[group gitosis-admin]
members = fulinux@ubuntu chensaiping@ubuntu
writable = gitosis-admin
[fulinux@ubuntu ~]$ cd gitosis-admin/
[fulinux@ubuntu gitosis-admin]$ git add .
[fulinux@ubuntu gitosis-admin]$ git commit -am 'add a new admin user:chensaiping'
[fulinux@ubuntu gitosis-admin]$ git push
我们会看到下面git仓库里的管理员仓库也更新了:
[git@ubuntu ~]$ cd repositories/gitosis-admin.git/
[git@ubuntu gitosis-admin.git]$ pwd
/home/git/repositories/gitosis-admin.git
[git@ubuntu gitosis-admin.git]$ vim gitosis.conf
[gitosis]
[group gitosis-admin]
members = fulinux@ubuntu chensaiping@ubuntu
writable = gitosis-admin
此时我们并没有将chensaiping的公钥文件拷贝过来。
17、我们在测试一下将gitosis-admin.git拷贝下来:
[chensaiping@ubuntu ~]$ pwd
/home/chensaiping
[chensaiping@ubuntu ~]$ git clone git@ubuntu:gitosis-admin.git
正克隆到 'gitosis-admin'...
git@ubuntu's password:
fatal: 'gitosis-admin.git' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
还是无法拷贝。
18、我们将chensaiping@ubuntu 的公钥发送到fulinux(因为fulinux是git的管理员)用户目录下:
[chensaiping@ubuntu ~]$ scp .ssh/id_rsa.pub scp .ssh/id_rsa.pub fulinux@ubuntu:/home/fulinux
19、将chensaiping@ubuntu 的公钥文件拷贝到下面的目录中,同时重命名:
[fulinux@ubuntu ~]$ pwd
/home/fulinux
[fulinux@ubuntu ~]$ mv id_rsa.pub gitosis-admin/keydir/[email protected]
[fulinux@ubuntu ~]$ cd gitosis-admin/
[fulinux@ubuntu gitosis-admin]$ git add .
[fulinux@ubuntu gitosis-admin]$ git commit -am '添加了[email protected]密钥文件'
[fulinux@ubuntu gitosis-admin]$ git push
这里管理员仓库添加了[email protected]公钥文件。
20、下面我们在chensaiping用户下测试一下能否将gitosis-admin.git克隆下来:
[chensaiping@ubuntu ~]$ git clone git@ubuntu:gitosis-admin.git
正克隆到 'gitosis-admin'...
remote: Counting objects: 12, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 12 (delta 0), reused 5 (delta 0)
接收对象中: 100% (12/12), done.
Checking connectivity... Done
我们看到chensaipingy用户无需输入密码就能将管理员目录gitosis-admin.git克隆下来。
可以说以后添加任何管理员的方式都和这个类似,我们可以让fulinux,或者新的管理员chensaiping来添加一个新的管理员。这个过程中,其他用户都无需知道git用户的密码,只要新添加的管理员提交了公钥文件,并且管理员将新用户的用户名加到了成员列表中。
21、下面我们将fulinux这个管理员去除掉:
[chensaiping@ubuntu ~]$ pwd
/home/chensaiping
[chensaiping@ubuntu ~]$ vim gitosis-admin/gitosis.conf
[gitosis]
[group gitosis-admin]
members = chensaiping@ubuntu
writable = gitosis-admin
删除了fulinux@ubuntu。
[chensaiping@ubuntu ~]$ cd gitosis-admin/
[chensaiping@ubuntu gitosis-admin]$ git add .
[chensaiping@ubuntu gitosis-admin]$ git commit -am '删除了管理员:fulinux@ubuntu'
[chensaiping@ubuntu gitosis-admin]$ git push
我们在fulinux用户下测试一下时候还有克隆gitosis-admin.git管理员目录的权限:
[fulinux@ubuntu ~]$ rm gitosis-admin/ -rf
[fulinux@ubuntu ~]$ git clone git@ubuntu:gitosis-admin.git
正克隆到 'gitosis-admin'...
ERROR:gitosis.serve.main:Repository read access denied
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
可见fulinux已经无法克隆gitosis-admin.git管理员目录了,chensaiping是git的唯一管理员了。
22、创建工程:
上面我们完成了添加和删除git管理员的工作,git的主要工作是代码维护,这里我们创建一个工程test,比如xudinchao向管理员chensaiping申请创建test工程。
chensaiping用户需要做如下工作:
[chensaiping@ubuntu ~]$ pwd
/home/chensaiping
[chensaiping@ubuntu ~]$ cd gitosis-admin/
[chensaiping@ubuntu gitosis-admin]$ vim gitosis.conf
[group gitosis-admin]
members = chensaiping@ubuntu
writable = gitosis-admin
[group test]
members = chensaiping@ubuntu xudinchao@ubuntu
writable = test
[chensaiping@ubuntu gitosis-admin]$ git add .
[chensaiping@ubuntu gitosis-admin]$ git commit -am '添加工程:test,成员:chensaiping,xudinchao'
[chensaiping@ubuntu gitosis-admin]$ git push
当然chensaipin也可以不加在这个项目的成员中,这个项目中的两个成员chensaiping@ubuntu xudinchao@ubuntu都具有对test工程读写的权限。
xudinchao用户需要作如下工作:
如果未向管理员提交自己的公钥文件,生成公钥文件,在提交给管理员chensaiping:
[xudinchao@ubuntu ~]$ pwd
/home/xudinchao
[xudinchao@ubuntu ~]$ git config --global user.name "xudinchao"
[xudinchao@ubuntu ~]$ git config --global user.email [email protected]
[xudinchao@ubuntu ~]$ ssh-keygen
一路回车,就行,也可以输入密码,克隆工程时会让你输入你输入的密码。
发送公钥文件给chensaiping管理员,可以过下面的方式,或者其他方式:
[xudinchao@ubuntu ~]$ scp .ssh/id_rsa.pub chensaiping@ubuntu:/home/chensaiping
接着chensaiping完成如下工作:
[chensaiping@ubuntu ~]$ pwd
/home/chensaiping
[chensaiping@ubuntu ~]$ mv id_rsa.pub gitosis-admin/keydir/[email protected]
23、这时chensaiping在自己的工作目录中创建一个test工程:
[xudinchao@ubuntu ~]$ pwd
/home/xudinchao
[xudinchao@ubuntu ~]$ mkdir test
[xudinchao@ubuntu ~]$ cd test/
[xudinchao@ubuntu test]$ git init
初始化空的 Git 版本库于 /home/xudinchao/test/.git/
[xudinchao@ubuntu test]$ touch test.c
[xudinchao@ubuntu test]$ git add .
[xudinchao@ubuntu test]$ git remote add origin git@ubuntu:test.git
[xudinchao@ubuntu test]$ git commit -am '添加了一个工程: test'
[chensaiping@ubuntu test]$ git push origin master:refs/heads/master
工程提交成功。
24、我们会看到在git用户的仓库下会出现一个test.git:
[git@ubuntu repositories]$ pwd
/home/git/repositories
[git@ubuntu repositories]$ ls
gitosis-admin.git test.git
[git@ubuntu repositories]$
25、这是xudinchao可以将这个工程克隆下来工作:
[xudinchao@ubuntu ~]$ git clone git@ubuntu:test.git
正克隆到 'test'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
接收对象中: 100% (3/3), done.
Checking connectivity... Done
[xudinchao@ubuntu ~]$ cd test/
[xudinchao@ubuntu test]$ ls
readme
比如说xudinchao添加了一个新的文件test.c,工作到一阶段,准备提交任务:
[xudinchao@ubuntu test]$ touch test.c
[xudinchao@ubuntu test]$ git add .
[xudinchao@ubuntu test]$ git commit -am '添加了一个新文件:test.c'
[xudinchao@ubuntu test]$ git push
查看进展:
[xudinchao@ubuntu test]$ git log
commit dc9305283a82be51cada963788ae2a17019d1c52
Author: xudinchao
Date: Thu Mar 6 11:23:55 2014 +0800
添加了一个新文件:test.c
commit 9b6220bbe4adf512cb5f96cd4aae27adcc99e0b6
Author: chensaiping
Date: Thu Mar 6 11:12:54 2014 +0800
添加了一个工程: test
如果chensaiping想查看进展:
[chensaiping@ubuntu test]$ git pull git@ubuntu:test.git
[chensaiping@ubuntu test]$ git log
commit dc9305283a82be51cada963788ae2a17019d1c52
Author: xudinchao
Date: Thu Mar 6 11:23:55 2014 +0800
添加了一个新文件:test.c
commit 9b6220bbe4adf512cb5f96cd4aae27adcc99e0b6
Author: chensaiping
Date: Thu Mar 6 11:12:54 2014 +0800
添加了一个工程: test
26、上面我们基本完成了添加项目的工作。
27、也许你每次都要输入类似以下的指令,会很繁琐,
git clone git@ubuntu:test.git
git clone git@ubuntu:gitosis-admin.git
下面我们作如下工作,以chensaiping为例,添加conf文件:
[chensaiping@ubuntu ~]$ pwd
/home/chensaiping
[chensaiping@ubuntu ~]$ vim .ssh/config
host git
user git
hostname 192.168.1.2
IdentityFile ~/.ssh/id_rsa
这时,我们可以使用类似下面的指令:
[chensaiping@ubuntu ~]$ git clone git:test.git
[chensaiping@ubuntu ~]$ git clone git:gitosis-admin.git
28、gitweb搭建
[git@ubuntu ~]$ pwd
/home/git
[git@ubuntu ~]$ ls
gitosis lost+found repositories
[git@ubuntu ~]$ sudo apt-get install gitweb
[git@ubuntu ~]$ sudo apt-get install apache2
[git@ubuntu ~]$ mkdir gitweb
[git@ubuntu ~]$ sudo ln -sf /usr/share/gitweb/* gitweb
[git@ubuntu ~]$ ls gitweb/
gitweb.cgi index.cgi static
[git@ubuntu ~]$ ln -s /home/git/repositories/ gitweb
[git@ubuntu ~]$ ls gitweb/
gitweb.cgi index.cgi repositories static
[git@ubuntu ~]$ sudo vim /etc/apache2/conf.d/gitweb
ServerName 127.0.0.1:80
ScriptAlias /gitweb /usr/lib/cgi-bin/
DirectoryIndex /gitweb/gitweb.cgi
DocumentRoot /home/clean/gitweb
ErrorLog /var/log/apache2/git.pcware.cn-error.log
Customlog "/var/log/apache2/git.pcware.cn-error.log" combined
/* The file original content */
#Alias /gitweb /usr/share/gitweb
#
# Options FollowSymLinks +ExecCGI
# AddHandler cgi-script .cgi
#
[git@ubuntu ~]$ sudo /etc/init.d/apache2 restart
[git@ubuntu ~]$ chmod 755 repositories/gitosis-admin.git/hooks/post-update
29、
附注:
1、Ubuntu 11.10 server 安装Git 服务器
2、git服务器搭建过程