本文记录了菜鸟时期自己是如何在服务器上搭建 git 服务的,也写成教程,造福后来的同学。

目录速览

前言

在个人 VPS 上安装 git 服务。
本文的所有内容都是在阿里云 ECS 的 Ubuntu 14.04 的系统下进行的。

背景

公司本部的开发项目可不能放在 Github 的开源仓库上,放私有仓库又需要一定的花费,崇尚自由的 Coder 怎么能就这样被束缚了呢?果断想到把源代码就放在公司的服务器上,而且还要加上版本管理工具,最好就是 Git!上一次写过一篇《一键部署前端代码到服务器》,算是相辅相成吧,实际开发中,个人倾向于这两篇博文结合起来的炫酷效果。
接下来就一起来探讨怎样在服务器上搭建 Git 服务,最后功能足够丰富的话,加上前端页面,还能像 Github 上一样呢!听起来高大上,其实什么东西都是学会之后就很简单。

配置服务器

什么资料都是开发者原版的最清晰最全面,先 po 上参考文章:
《Git官方文档-服务器上的Git-配置服务器》
其实上面的已经够全面的了,但是对于小白来说,还是不能够很好地理解,这里我来补充完善。

PS: 下面约定俗成一下

  • 终端A 是登录到远程服务器的 git-bash 或其他的终端
  • 终端B 是本地操作的 bash 或其他的终端

在linux服务器上安装git工具并配置

安装git工具:

1
2
3
4
# 更新安装源
$ sudo apt-get update
# 安装git工具
$ sudo apt-get install git

配置git:

1
2
$ git config --global user.name "Your Name"
$ git config --global user.email "name@mailname.com"

查看git的配置信息:

1
$ git config --list

为linux服务器新建用户并添加SSH信任

先为你的 linux 服务器新建一个 git 用户。

终端A

1
2
3
4
5
6
$ sudo adduser -d /home/git -m git  #没错,用户名就是git,若不存在用户目录,则会创建
#输入设置git用户的密码,此步骤在此不展示,建议密码设置复杂点,毕竟是放在网上的
$ sudo chmod 755 /home/git
$ su git
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys

我们一旦新创建了用户,就会自动在 /home 目录下新建一个与用户名相应的文件夹,经过上述操作,自动新建了 /home/git 文件夹,该目录称为 git 用户的家目录,对其他普通用户是一样的道理。

而超级用户 root 的 home 目录不在 /home/ 下,而是 /root 目录。

假定这里我们以前都与 Github 建立过 SSH 信任,或者是阅读过我的《一键部署前端代码到服务器》并会创建本地 SSH 的秘钥与公钥文件,那么下面继续,新开一个git-bash终端B 找到我们的 id_rsa.pub 公钥文件目录,然后远程拷贝到服务器。

终端B

1
2
3
$ cd ~/.ssh/
$ ls ./id_rsa.pub
$ scp ./id_rsa.pub root@114.xxx.xxx.xxx:/home/git

又回来终端A下继续操作:
终端A

1
2
3
4
5
6
#切换到 git 用户
$ su git
# 进入 git 用户的家目录
$ cd /home/git
# 将 id_rsa.pub 文件内容追加到 authorized_keys 中
$ cat ./id_rsa.pub >> .ssh/authorized_keys

退出 SSH 登录,然后重新以 git 用户的身份进入即可,不再需要输入 git 用户的密码

测试是否可以免密登录:

1
ssh -v git@SERVER


注意:
1. 必须保证 git 用户的根目录的文件夹权限为 755
2. 必须保证 git 用户的根目录下的 .ssh 文件夹权限为 700
3. 必须保证 git 用户的根目录下的 .ssh 文件夹中的 authorized_keys 文件的权限为 600

为新建的 git 用户搭建 git 仓库

以 git 用户的身份远程 SSH 登录服务器:

1
$ ssh git@114.xxx.xxx.xxx

借助带 --bare 选项的 git init 命令来为开发者新建一个仓库,该命令在初始化仓库时不会创建工作目录:

1
2
3
4
5
6
7
8
9
# 新仓库要建立在哪个文件夹自己选,方便组织管理就行,我就直接放在 git 用户的家目录下
$ cd /home/git
# 创建一个新仓库目录
$ mkdir testProject.git
# 进入新仓库目录
$ cd testProject.git
# 初始化该新仓库
$ git init --bare
Initialized empty Git repository in /home/git/testProject.git/

至此,一个存在于自己服务器上的 git 仓库就搭建好了,该仓库的地址就为: `git@114.xxx.xxx.xxx:/home/git/testProject.git,一看,哇靠,跟项目在 github 上的地址格式是一样的!例如:git@github.com:ironmaxtory/ironmaxtory.github.io.git,心里着实激动!现在自己的服务器的/home/git` 就相当于一个小型简陋的 Github 仓库了,同理也能够无限的添加新仓库,保存新的工程项目代码。

关联操作服务器上的 git 仓库

经过上面两个步骤,就可以关联操作服务器上的 git 仓库并上传保存自己的代码了:

1
2
3
4
5
6
# 在本地先进入自己的工程代码根目录
$ cd testProject
# 添加远程服务器的仓库并取昵称为tsOrigin,区别于github上的origin仓库
$ git remote add tsOrigin git@114.xxx.xxx.xxx:/home/git/testProject.git
# 向远程仓库推送代码
$ git push tsOrigin master

添加多人协作

这个场景必须有而且很常见,公司的项目代码一般是多人维护的;就算不是一人维护的,那你上传到测试服务器上的最终目的都是为了在多台电脑上可以下载并上传提交代码,所以需要添加多人协作!其实也很简单,只需要把需要协作的 PC 上的 SSH 公钥追加到 git 用户下家目录的授权钥匙文件 /home/git/.ssh/authorized_keys 中即可,用cat命令。

限制开发者远程登录linux服务器

需要注意的是,目前所有(获得授权的)开发者用户都能以系统用户 git 的身份登录服务器从而获得一个普通 shell。
借助一个名为 git-shell 的受限 shell 工具,你可以方便地将用户 git 的活动限制在与 Git 相关的范围内。该工具随 Git 软件包一同提供。 如果将 git-shell 设置为用户 git 的登录 shell(login shell),那么用户 git 便不能获得此服务器的普通 shell 访问权限。 若要使用 git-shell,需要用它替换掉 bash 或 csh,使其成为系统用户的登录 shell。 为进行上述操作,首先你必须确保 git-shell 已存在于 /etc/shells 文件中,并将 git-shell 的位置添加到 /etc/shells 目录中

1
2
3
4
5
6
# see if `git-shell` is already in there.  If not...
$ cat /etc/shells
# make sure git-shell is installed on your system.
$ which git-shell
# and add the path to git-shell from last command
$ sudo vim /etc/shells

接下来可以使用 chsh <username> 来修改任一系统用户的 shell:

1
2
# and enter the path to git-shell, usually: /usr/bin/git-shell
$ sudo chsh git

这样,用户 git 就只能利用 SSH 连接对 Git 仓库进行推送和拉取操作,而不能登录机器并取得普通 shell。 如果试图登录,你会发现尝试被拒绝,像这样:

1
2
3
4
$ ssh git@114.xxx.xxx.xxx
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to gitserver closed.

福利奉献

自定义映射远程服务器IP地址的域名

每次远程登录都要这样 ssh root@114.xxx.xxx.xxx,很麻烦有没有?!没有配域名的而且IP地址复杂后更加恶心有没有?!来一起配置一下对于本地的服务器的域名!编辑 /c/windows/system32/drivers/etc目录下的 hosts 文件,用 editplus 软件打开即可,如下添加一行:

1
114.xxx.xxx.xxx (空格) ts.aliyun.com (回车换行)

保存退出,一般来说,并不能立即生效,有如下几种解决方案,反正我全都用了-.-

  1. DOS界面下
    dos dns
  2. 网络配置,添加hosts文件
    configAdvOptions dns
    addHostsFile dns
  3. 控制面板->管理工具->服务->DNS Client 修改为手动
    modifiedDNSService dns

以后就可以这样:

1
ssh root@ts.aliyun.com