在个人服务器上搭建git服务,创建属于自己的私人仓库

8,339 阅读5分钟

前言

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

背景

公司本部的开发项目可不能放在Github的开源仓库上,放私有仓库又需要一定的花费,崇尚自由的Coder怎么能就这样被束缚了呢?果断想到把源代码就放在公司的服务器上,而且还要加上版本管理工具,最好就是Git!接下来就一起来探讨怎样在服务器上搭建Git服务,最后功能足够丰富的话,加上前端页面,还能像Github上一样呢!听起来高大上,其实什么东西都是学会之后就很简单。

配置服务器

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

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

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

安装git工具:

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

配置git:

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

查看git的配置信息:

git config --list

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

先为你的linux服务器新建一个git用户,我的linux服务器是公司租用ali的测试服务器,先登录到root超级用户,再操作下面的。PS: 代码中的用户提示符$看成是#号即可,因为是root超级用户,不写成是#的原因是会变成注释 终端A

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

PS1: 我们一旦新创建了用户,就会自动在/home目录下新建一个与用户名相应的文件夹,经过上述操作,自动新建了/home/git文件夹,该目录称为git用户的家目录,对其他普通用户是一样的道理 PS2: 超级用户root的家目录不在/home/下,而是/root目录 假定这里我们以前都与Github建立过SSH信任,或者是阅读过我的《一键部署前端代码到服务器》并会创建本地SSH的秘钥与公钥文件,那么下面继续,新开一个git-bash终端B 找到我们的id_rsa.pub公钥文件目录,然后远程拷贝到服务器: 终端B

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

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

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

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

测试是否可以免密登录:

ssh -v git@SERVER
严重警告: 1. 必须保证git用户的根目录的文件夹权限为 755 2. 必须保证git用户的根目录下的.ssh文件夹权限为 700 3. 必须保证git用户的根目录下的.ssh文件夹中的authorized_keys文件的权限为 600

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

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

$ ssh git@114.xxx.xxx.xxx
```linux
借助带 `--bare` 选项的 `git init` 命令来为开发者新建一个仓库,该命令在初始化仓库时不会创建工作目录:
```sh
$ cd /home/git  #新仓库要建立在哪个文件夹自己选,方便组织管理就行,我就直接放在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仓库并上传保存自己的代码了:

$ cd testProject  #在本地先进入自己的工程代码根目录
$ git remote add tsOrigin git@114.xxx.xxx.xxx:/home/git/testProject.git  #添加远程服务器的仓库并取昵称为tsOrigin,区别于github上的origin仓库
$ 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目录中

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

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

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

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

$ 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打开即可,如下添加一行:

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

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

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

以后就可以这样:

ssh root@ts.aliyun.com

关于我

欢迎关注 [程序猿何大叔] 公众号
你的关注 就是我的动力