下面简单记录一下搭建过程,我是 ubuntu18.04,本教程基本适用于目前主流版本的 ubuntu(14.x、16.x)。

正文开始。

1、安装 git 服务器所需软件

sudo apt-get update
sudo apt-get install git-core openssh-server openssh-client

git-core 是git版本控制核心软件。

安装 openssh-server 和 openssh-client 是由于git需要通过ssh协议来在服务器与客户端之间传输文件。

(因为我用的阿里云实例 ubuntu18.04 已经预安装了 git 和 ssh 服务了,所有我在这里不需要再装)

2、安装 gitosis

gitosis 是一套用来管理 authorized_keys 文件和实现简单连接限制的脚本。

它可以通过一个名叫 gitosis-admin.git 的 Git 仓库,实现对用户和权限的管理。

也就是说,你只需要在这个 gitosis-admin.git 上做相应的配置修改,然后 push 你的修改,gitosis 即可实现相应的仓库权限控制。

接下来,开始安装 gitosis。

由于 gitosis 的安装需要用到 python 脚本和工具,所以需要

先安装 python  的 setuptools:

sudo apt-get install python-setuptools

接着安装 gitosis:

安装之前需要先初始化一下 git 的用户和邮箱,这两个值随便即可:

git config --global user.name "lai"   
git config --global user.email "lai@gmail.com"  
cat ~/.gitconfig     ### 查看 git 设置的用户信息

获取 gitosis 版本文件

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

下载完成,进入 gitosis 文件夹,然后使用 setup.py 脚本安装

cd gitosis/
sudo python setup.py install

好了,gitosis 到这里就安装完了,是不是很简单~(这里只是安装,当然简单,后面的配置才麻烦而已,表急,我们继续)

 

3、创建 git 用户,并配置项目仓库文件夹

sudo adduser git
### 这里会提示输入密码,我这边设置的密码也是 git 。

查看 /home ,会发现多了一个 git 的文件夹,这个文件夹是 git 用户的专属文件夹。

然后在 /home 下新建一个用于 git 仓库存储的文件夹 gitrepo ,并将权限给 git 用户,其他用户可读:

sudo mkdir /home/gitrepo
sudo chown git:git /home/gitrepo
sudo chmod 755 /home/gitrepo

由于 gitosis 默认情况下会将仓库放在 git 用户的 repositories 下,也就是项目仓库的默认路径是 /home/git/repositories/。

又由于我们想的仓库路径是刚新建的 /home/gitrepo/ ,所以就需要在 /home/git 下设置一个名叫 repositories  软链接,让它映射到我们的仓库文件夹 /home/gitrepo/ :

sudo ln -s /home/gitrepo /home/git/repositories

这样一来,访问 /home/git/repositories/ 文件夹时,实际访问的就是 /home/gitrepo/ 了。

 

4、生成 ssh 公钥,初始化 gitosis

为何要生成 ssh 公钥?初始化 gitosis 有啥用?(至少我当时有这么些疑问..)

前面说过,gitosis 是通过一个名为 gitosis-admin.git 的特殊仓库,来实现对其他项目仓库的一些配置文件(如:用户权限)进行管理的。

这个 gitosis-admin.git 仓库从哪来?从 gitosis 初始化获得的,而初始化 gitosis ,需要 gitosis 管理服务器的 ssh 公钥。

也就是说,初始化 gitosis 时用的是谁的公钥,谁就是 gitosis 管理服务器,就能用 gitosis 管理 gitosis-admin.git 和其他放在这里的项目仓库。(不知道这样理解贴不贴切,个人觉得是这么个意思)

在这里,我直接在这台 git 服务器上生成 ssh 公钥,所以这台服务器即是 git 服务器,又是 gitosis 管理服务器。

执行命令:

ssh-keygen -t rsa  
#### 这里会提示输入密码,直接留空就行,一路 enter 就行。同时你可以看到,即将生成的密钥文件的存放路径在哪,我这里是在 /home/lai/.ssh/ 文件夹,因为我当前的 linux 用户是 lai。

之后,在 /home/lai/.ssh/ 文件夹下,可以看到 id_rsa(私钥) 和 id_rsa.pub(公钥) 两个文件。

用 id_rsa.pub 公钥初始化 gitosis ,执行命令:

sudo -H -u git gitosis-init < /home/lai/.ssh/id_rsa.pub

ubuntu 搭建git服务仓库 ubuntu git服务器_ubuntu

看到以上信息,说明初始化成功了。

 

这时,打开 /home/gitrepo 文件夹,会发现多了一个 gitosis-admin.git 仓库。(之所以会在这里,是因为 gitosis-admin.git 仓库默认放在 /home/git/repositories  文件夹下,而 /home/git/repositories 个软链接,映射到 /home/gitrepo )

接下来,需要手工对该仓库中的 post-update 脚本加上可执行权限(这个脚本应该是用于自动更新配置的钩子):

sudo chmod 755 /home/gitrepo/gitosis-admin.git/hooks/post-update

注:如果你是手动敲上面这行命令,会发现到 hooks 时,用键盘的 Tab 快捷键不会自动补全 hooks。这是因为我当前的 linux 用户(lai)没有读 gitosis-admin.git 文件夹的权限,所以在这里,我将 gitosis-admin.git 文件夹权限改成任何用户都可读:

sudo chmod 755 /home/gitrepo/gitosis-admin.git/

 

5、在服务器创建测试项目仓库

以 git 账户创建一个测试项目仓库 mytest ,然后退出 git 账户:

su git
cd /home/gitrepo
mkdir mytest
git init --bare
exit

新建的 mytest 项目仓库是个“裸仓库”,是不能被客户端 clone。(更多关于 git init --bare 和 git init 的区别,请参考:git init 与 git init --bare 的区别

接下来,需要对 gitosis 进行一些配置,使得 mytest 项目仓库可以被 gitosis 管理。

 

6、配置 gitosis 

首先在 gitosis 管理服务器(也就是初始化时,用来生成 ssh 公钥的那台机,在这里,我是同一台机)将 gitosis-admin.git 仓库 clone 下来。

新建一个目录用来放 gitosis-admin.git :

cd ~
mkdir gitadmin
cd gitadmin
git clone git@(你的ip):gitosis-admin.git

看到如下信息,说明 clone 正确:

ubuntu 搭建git服务仓库 ubuntu git服务器_ubuntu_02

 

clone 下来的 gitosis-admin.git 里面,

gitosis.conf 文件,用来配置仓库、用户、权限的信息

keydir 文件夹,用于存放用户的 ssh 公钥,这些公钥一般以“用户名.pub”命名,gitosis.conf 配置文件中需使用相同用户名。

也就是说,所有需要 git 请求的客户端机器,都需要在自己机器上生成 ssh 公钥(用命令“ssh-keygen -t rsa”),

然后 gitosis 管理员再将这些公钥收集起来,统一放到 keydir 文件夹下,其中公钥的名称要以相应的用户名命名。

 

比如,我在本地的机器(window10)中,在 git bash 运行命令 “ssh-keygen -t rsa”生成了公钥,公钥的位置在“C:\Users\Administrator\.ssh\id_rsa.pub”,用户名为“Administrator@LAI-PC”:

ubuntu 搭建git服务仓库 ubuntu git服务器_ubuntu_03

ubuntu 搭建git服务仓库 ubuntu git服务器_ubuntu_04

 

那么,我就需要将本地的 id_rsa.pub 文件,复制到 gitosis 管理服务器的 /home/lai/gitadmin/gitosis-admin.git/keydir/ 文件夹下,重命名为 Administrator@LAI-PC.pub :

ubuntu 搭建git服务仓库 ubuntu git服务器_ubuntu_05

然后,编辑 ~/gitadmin/gitosis-admin.git/gitosis.conf

cd ~/gitadmin/gitosis-admin.git
vi gitosis.conf

添加如下内容:

ubuntu 搭建git服务仓库 ubuntu git服务器_gitosis_06

其中,

[group testwrite] 表示管理员组 testwrite,名字可以随意;

members 表示管理员用户名,需要在 keydir 目录下找到相应的.pub文件,多个可用空格隔开;

writable 表示可写的项目仓库名,多个可用空格隔开。

因为这些配置的修改只是在本地修改的,还需要推送到服务器中才能生效

git add .
git commit -am '添加 mytest 项目仓库的用户权限'
git push origin master

 

ubuntu 搭建git服务仓库 ubuntu git服务器_ubuntu_07

 

由于后添加的用户不会马上生效,可以重启一下 sshd 服务:

sudo /etc/init.d/ssh restart

到此,git 服务端的安装和配置就完成了。

接下来,就可以在客户端机器上各自 clone 相应的项目仓库,开展相应工作了。

 

7、客户端机器使用 git 进行项目版本管理

还记得我们前面在 git 服务端新建的裸仓库 /home/gitrepo/mytest.git 吗? 

这个 mytest.git 仓库是空的,现在需要一个对此仓库有管理权限的用户,在本地初始化一个版本,并与 git 服务端 mytest.git 仓库关联起来。这样,其他用户就可以直接 clone 这个项目仓库了。

我的本本是 windows10 ,已经安装了 git for windows 。

鼠标右键,打开 git bash,在本地新建一个项目文件夹,用 git init 初始化成工作目录,然后新建一个测试文件,最后关联到 git@[你的git服务端ip]:mytest.git,操作命令如下:

mkdir testgit
cd testgit
git init
echo "这个一个测试 git 的文件" > readme.txt
git add .
git commit -am '提交 mytest 项目仓库的初始版本'
git remote add origin git@[你的git服务端ip]:mytest.git
git push origin master

这样一来,git 服务端的 mytest.git 仓库就有一个初始版本了。

之后其他用户就可以直接 clone 这个项目仓库了。

 

现在测试一下。进入本地另一个文件夹内,鼠标右键打开 git bash,clone 这个项目仓库:

git clone git@[你的git服务端ip]:mytest.git

再之后,就是你的编码之旅了。

 

(这个一条分界线)====================

如果想从本地(windows系统)通过拖拽文件的方式,通过 ssh 客户端(如 Xshell),直接将文件复制到远程服务器(ubuntu系统),可以在 ubuntu 系统中安装 lrzsz:

sudo apt-get install lrzsz

这样,就可以直接拖拽本地的 id_rsa.pub 到服务端的 keydir 文件夹下了。