刚入职一个月左右,昨晚公司给培训了SVN和Git的使用。之前在研究生期间,和导师做项目就一直使用git做版本管理。想起研究生有一段时间,git总出错(秘钥都不好使了,只有某个机器生成的rsa key 可以使用),我和亮哥、杨老师调了一下午,想起这段经历,加上昨晚培训的内容,让我有种想搭建Git服务器的冲动。于是。趁着今天周五,晚上有空,说干就干。
环境准备:虚拟机:VMware WorkStation 12 Player.(免费,自行下载). 镜像文件:Ubuntu16
环境准备好之后,那就开始吧。
reference:http://www.linuxidc.com/Linux/2015-07/120616.htm
Ubuntu16 搭建Git 服务器
一.在Ubuntu上安装Git服务器所需软件
1.安装git-core, openssh-server, openssh-client三个软件。git-core是git的核心软件; openssh-server、openssh-client是服务器和客户端传输文件通过ssh协议。
安装命令:”sudo apt-get install git-core openssh-server openssh-client”。
注意:如果此步骤安装失败,可能是软件库过旧,使用“sudo apt-get update”命令,更新软件库。
2. 安装python-setuptools软件。该软件是用来安装gitosis的。
安装命令:”sudo apt-get install python-setuptools”。
3.安装gitosis。Gitosis主要用于管理用户对仓库的操作权限。
Pre:安装gitosis之前,需要初始化git服务器用户信息。
输入命令:“git config --global user.name ”charlie””;
“git config --global user.email ”995940119@qq.com””。
Next: 获取gitosis版本文件
输入命令:“git clone https://github.com/res0nat0r/gitosis.git”。
Final: 安装gitosis.
进入gitosis目录,使用python命令安装目录下的setup.py的python脚本进行安装。输入命令:“sudo python setup.py install”。
到这里,服务器上git所需软件都已安装完毕。
二.配置Git服务器
1.创建git管理员账户
增加用户命令:sudo useradd -m git
修改git用户密码:sudo passwd git 输入密码(123)
2. 创建项目仓库存储点
在/home/目录下创建一个目文件夹作为仓库sudo mkdir /home/gitrepository,
修改用户组和权限
由于gitosis默认状态下会将仓库放在用户的repositories目录下,例如git用户的仓库地址默认在/home/git/repositories/目录下,这里我们需要创建一个链接映射。让他指向我们前面创建的专门用于存放项目的仓库目录/home/gitrepository。
3. 初始化gitosis
First: 在服务端生成SSH公钥,输入命令:“ssh-keygen -t rsa”,这里会提示输入密码,我们不输入直接回车即可。
Next: 用刚生成公钥id_rsa.pub来对gitosis进行初始化。输入命令:“sudo -H -u git gitosis-init < /root/.ssh/id_rsa.pub”。
出现如上信息说明gitosis已经初始化成功。
gitosis主要是通过gitosis-admin.git仓库来管理一些配置文件的,如用户权限的管理。这里我们需要对其中的一个post-update文件添加可执行的权限。
ubuntu:/home/git$ sudo chmod 755 /home/gitrepository/gitosis-admin.git/hooks/post-update
三.服务器中创建项目仓库
使用git账户在服务器上创建一个目录(mytestproject.git)并初始化成git项目仓库。
ubuntu:/home/git$ su git
$ cd /home/gitrepository
$ mkdir mytestproject.git
$ cd mytestproject.git/
$ git init --bare
$ exit
四.使用gitosis管理用户操作项目的权限
1. 首先需要在前面生成ssh公钥(用来初始化gitosis)的机器上将gitosis-admin.git的仓库clone下来。
在客户端机器上新建一个目录用于存放gitosis-admin.git仓库
ubuntu:~$ mkdir gitadmin
ubuntu:~$ cd gitadmin/
ubuntu:~/gitadmin$ git clone git@localhost:gitosis-admin.git
clone下来会有一个gitosis.conf的配置文件和一个keydir的目录。gitosis.conf用于配置用户的权限信息,keydir主要用户存放ssh公钥文件(一般以“用户名.pub”命名,gitosis.conf配置文件中需使用相同用户名),用于认证请求的客户端机器。
现在让需要授权的用户使用前面的方式各自在其自己的机器上生成相应的ssh公钥文件,管理员把他们分别按用户名命名好,复制到keydir目录下。
继续编辑gitosis.conf文件
[gitosis]
[group gitosis-admin]
####管理员组
members = charn@ubuntu
####管理员用户名,需要在keydir目录下找到相应的.pub文件,多个可用空格隔开(下同)
writable = gitosis-admin####可写的项目仓库名,多个可用空格隔开(下同)
[group testwrite]
####可写权限组
members = zhangsan####组用户
writable = mytestproject####可写的项目仓库名
[group
testread] ####只读权限组
members =lisi####组用户
readonly= mytestproject####只读项目仓库名
因为这些配置的修改只是在本地修改的,还需要推送到服务器中才能生效。
ubuntu:~/gitadmin/gitosis-admin$ git add .
ubuntu:~/gitadmin/gitosis-admin$ git commit -am "add a user permission"
ubuntu:~/gitadmin/gitosis-admin$ git push origin master
重新启动一下sshd服务
ubuntu:~/gitadmin/gitosis-admin$ sudo /etc/init.d/ssh restart
现在,服务端的git就已经安装和配置完成了,接下来就需要有权限的组成员在各自的机器上clone服务器上的相应
项目仓库进行相应的工作了。
五.客户端使用Git
下载安装windows版本的git客户端软件,下载地址:http://msysgit.github.io/
安装完成后右键菜单会出现几个git相关的菜单选项,我们主要使用其中的git
bash通过命令行来进行操作。
在本地新建一个目录,使用git初始化这个目录,然后再里面新建一个文本文件用于测试,最后关联到git服务器仓库
中的相关项目,最后上传本地版本到服务器。
$ mkdir testgit
$ cd testgit
$ git init
$ echo "this is a test text file,will push to server" > hello.txt
$ git add .
$ git commit -am "init a base version,add a first file for push to server"
$ git remote add origin git@serverip:mytestproject.git
$ git push origin master
这样服务端就创建好了一个mytestproject.git的仓库的基础版本了,现在其他组员只要从服务端进行clone就可以了。
window下面进入到需要克隆的本地目录下面右键选择git bash选项,输入
$ git clone git@serverip:mytestproject.git
就可以把项目clone到本地仓库了。
下面进行简单的修改和提交操作
$ cd mytestproject
$ echo "this is another text file created by other" >another.txt
$ git add .
$ git commit -am "add a another file by other"
$ git push origin master
六、错误列表
1. “remote: error: insufficient permission for adding an object to repository database ./objects ”
解决方案:查看原mytestproject.git目录权限,发现mytestproject.git/object/没有group写权限导致;执行 $ sudo chmod g+w -R mytestproject.git/object 后OK