版本控制相信大家都听说过。Git
鼎鼎大名我想大家肯定也有所耳闻。但是Github
上的repo
都是公开的,要使用私有repo
需要付费。而今天我们就要来讲解一下如何在Linux
环境下搭建起Git Server
实现开发团队的版本控制:
即可以使用
git clone
命令从服务器上克隆项目,并且可以向服务器推送及拉取更新。
我们的演示环境是一台阿里云服务器,系统Ubuntu 16.04 LTS
,在讲解过程中,我会对比使用Amazon
云服务器操作步骤的区别。
一般来说,现在云服务器Ubuntu
环境都已经安装好git
了,如果没有的话,我们需要自行安装一下:
$ sudo apt-get install git
那么我们的操作分为几个步骤:
- 在服务器上创建专门用于
git
操作的用户- 本地创建新的
ssh
秘钥,并将公钥上传至服务器中,用于远程连接步骤1
中的git
用户- 在服务器上创建
git
项目文件夹- 将本地项目文件推送至服务器
步骤明确了,那么我们就开始操作。
1. 在服务器上创建专门用于git
操作的用户
在服务器中输入以下命令,建立名为git
的用户:
$ sudo su
$ adduser git
Adding user `git' ...
Adding new group `git' (1001) ...
Adding new user `git' (1001) with group `git' ...
Creating home directory `/home/git' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
我们需要为该用户输入新密码,该密码将作为之后git
推送和拉取时远程连接需要用到的密码。
接下来,我们需要建立起.ssh
文件夹及相应的authorized_keys
文件,用来添加授权用户的public key
:
$ su git
$ cd ~
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
2. 本地创建新的ssh
秘钥,并将公钥上传至服务器中
在本地环境下,新建一对ssh
秘钥:
$ cd ~/.ssh
$ ssh-keygen -t RSA -b 2048 -C "Local Developer"
输入以上命令后,我们会看到以下提示:
Generating public/private RSA key pair.
Enter file in which to save the key (/home/eagle/.ssh/id_rsa):
这里我们可以直接按回车保留默认秘钥文件路径,或者你可以填写方便自己辨识的秘钥名称(但是如果你不注明路径的话,那么秘钥默认生成在当前文件夹下)。
该步完成后,我们会看到要我们输入密码的提示:
Enter passphrase (empty for no passphrase):
这里我们直接回车默认不设置密码。
完成后,我们可以看到.ssh
文件夹中多出了两个文件,一个无后缀名的文件为私钥,另一个.pub
后缀的为公钥。假设我们创建的私钥名称为git
,那么对应的公钥就是git.pub
。
我们需要把公钥中的内容添加到服务器上git
用户的~/.ssh/authorized_keys
中:
//将git.pub上传到服务器根目录
$ scp git.pub root@server-ip:~/
//将git.pub中的内容添加到authorized_keys中
root@server-ip:~$ sudo cat git.pub >> /home/git/.ssh/authorized_keys
(当然如果你嫌上传麻烦也可以直接把公钥中的信息粘贴到服务器端的authorized_keys
中)
这里讲解一下如果你用的是Amazon
云服务器,你需要使用Amazon
后台建立一对新的密钥。Amazon
后台生成的密钥为一个.pem
后缀的文件,我们下载秘钥到本地后,使用
chmod 400 git.pem
ssh-keygen -y -f git.pem
来读取.pem
文件中的公钥内容。读取到公钥内容后,我们也是一样按照上述步骤将公钥添加至/home/git/.ssh/authorized_keys
。
现在我们尝试使用ssh
以git
用户身份登陆到服务器:
$ ssh git@server-ip
输入git
用户密码,若显示连接成功,那么我们已经接近成功了!
这里注意Amazon
服务器用户需要在~/.ssh
中添加名为config
的文件,并将以下内容添加至该文件中:
Host my-aws-host-ip
IdentityFile ~/.ssh/git.pem
该步骤目的是为了确保连接服务器时使用的是正确的私钥。
请用你的服务器公共地址替换上面的my-aws-host-ip
。
3. 在服务器上创建git
项目文件夹
这个步骤很简单,我们在/srv/git
下创建一个我们的项目文件夹:
$ sudo mkdir -p /srv/git/eagle.git
下面一步,我们要初始化这个文件夹:
$ cd /srv/git/eagle.git
$ git init --bare .
注意,我们用了--bare
这个参数,表示我们这个git
文件夹中将不会有工作文件夹(Working Directory
)。
然后我们更改一下文件所属用户:
$ sudo chown -R git: /srv
4.将本地项目文件推送至服务器
现在我们就可以将本地项目推送至我们的服务器了!
首先我们进入我们的项目,初始化git
并添加remote
地址:
$ cd my-project
$ git init .
$ git add .
$ git commit -m "initial commit"
$ git remote add origin git@server-ip:/srv/git/eagle.git
完成之后,我们就可以进行第一次推送了:
$ git push origin master
当然,我们也可以拉取远程项目文件:
$ git pull origin master
以上我们就完成了Git
服务器的搭建,如果我们需要在其他电脑或者环境推送或者拉取,那么我们只需要在新环境中克隆我们的项目文件就可以进行拉取和推送了:
$ git clone git@server-ip:/srv/git/eagle.git
$ cd eagle
$ vim README
$ git commit -am 'fix for the README file'
$ git push origin master
另外,如果需要限制Git
用户不能使用ssh
进行远程登录,可以参考我的另一篇文章:
参考资料:
https://git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server
https://aws.amazon.com/premiumsupport/knowledge-center/new-user-accounts-linux-instance/
https://kb.iu.edu/d/aews