前言
在个人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 "[email protected]"
复制代码
查看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 [email protected]:/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 [email protected]
```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仓库就搭建好了,该仓库的地址就为:[email protected]:/home/git/testProject.git
,一看,哇靠,跟项目在github上的地址格式是一样的!例如:[email protected]:ironmaxtory/ironmaxtory.github.io.git
,心里着实激动!现在自己的服务器的/home/git
就相当于一个小型简陋的Github仓库了,同理也能够无限的添加新仓库,保存新的工程项目代码。
关联操作服务器上的git仓库
经过上面两个步骤,就可以关联操作服务器上的git仓库并上传保存自己的代码了:
$ cd testProject #在本地先进入自己的工程代码根目录
$ git remote add tsOrigin [email protected]:/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
来修改任一系统用户的shell:
$ sudo chsh git # and enter the path to git-shell, usually: /usr/bin/git-shell
复制代码
这样,用户 git 就只能利用 SSH 连接对 Git 仓库进行推送和拉取操作,而不能登录机器并取得普通 shell。 如果试图登录,你会发现尝试被拒绝,像这样:
$ ssh [email protected]
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 [email protected]
,很麻烦有没有?!没有配域名的而且IP地址复杂后更加恶心有没有?!来一起配置一下对于本地的服务器的域名!编辑/c/windows/system32/drivers/etc
目录下的hosts
文件,用editplus
打开即可,如下添加一行:
114.xxx.xxx.xxx (空格) ts.aliyun.com (回车换行)
复制代码
保存退出,一般来说,并不能立即生效,有如下几种解决方案,反正我全都用了-.-
- DOS界面下
- 网络配置,添加hosts文件
- 控制面板->管理工具->服务->DNS Client 修改为手动
以后就可以这样:
ssh [email protected]
复制代码
关于我
欢迎关注 [程序猿何大叔] 公众号
你的关注 就是我的动力