git简介

Git是当前最流行的分布式版本控制系统,SVN是集中式版本控制系统,两者的区别可以看廖雪峰的集中式vs分布式,目前流行的开源的网站github码云Gitee都是用git来做版本控制的,但是都是开源的,私有的需要付费,所以尝试在centos搭建自己的git服务

git的安装配置

$ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel
$ yum install git

其他linux版本系统安装的安装地址

创建git用户和密码

以下创建用户和密码都是git

useradd git
passwd git

useradd命令用于Linux中创建的新的系统用户。useradd可用来建立用户帐号。帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号。使用useradd指令所建立的帐号,实际上是保存在/etc/passwd文本文件中。

创建git仓库

在相应的目录下创建git仓库

sudo git init --bare /home/gitfolder.git

对git init命令添加 --bare 参数就表示初始化Git仓库的时候不要创建本地工作目录,所以相当于.git 文件夹下的所有内容直接创建到当前目录下,而不是被放到.git目录下。

clone代码

在pc端克隆服务器的代码

git clone git@111.22.33.44:/home/gitfolder.git

这里的git@111.22.33.44前面的git代表的是useradd的用户名

输入上面配置的git密码(此时密码是git)显示如下信息 

warning: You appear to have cloned an empty repository.

通过上面的步骤就可以搭建起git服务,接下来在工作目录新增一个文件提交,发现报错insufficient permission for adding an object to repository database是因为git用户对这个文件夹没有权限操作,所以把当前的gitfoler.git仓库权限赋给git用户,所以需要在服务端执行以下命令

sudo chown -R git:git /home/gitfolder.git

chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组。用户可以是用户或者是用户D,用户组可以是组名或组id。文件名可以使由空格分开的文件列表,在文件名中可以包含通配符。只有文件主和超级用户才可以便用该命令。

至此git服务器就算搭建成功了,不过有一个缺点,每次clone或者push都需要输入密码,可以使用把客户端的公钥给放到服务器上即可实现免密通信

生成SSH公钥

由于git服务器可以使用SSH公钥进行认证,可以在客户端需要生成私钥和公钥,然后把公钥放到git服务器的authorized_keys文件即可,首先在windows命令行下执行

ssh-keygen -t rsa -C "340443366@qq.com"

一路回车,就会在C:\Users\kelen\.ssh目录下生成对应的私钥和公钥,将.ssh文件夹里面的id_rsa.pub里面的内容追加到服务器的~/.ssh/authorized_keys文件里,做法是把本地的id_rsa.pub拷贝到authorized_keys相同目录下,输入命令

cat id_rsa.pub >> authorized_keys

然后重启服务

$ systemctl restart sshd.service // restart ssh service

到这一步发现每次push代码还是需要输入密码,发现原因还是没有对git用户赋予authorized_keys权限,需要在服务器切换git用户来操作

$ su git

创建.ssh文件夹和相应权限

$ mkdir ~/.ssh && chmod 700 ~/.ssh

新增authorized_keys和相应的权限

$ touch ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys

打开RSA认证

在服务端的文件/etc/ssh/sshd_config打开RSA认证,找到下面对应的选项,取消注释

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile  .ssh/authorized_keys

禁用shell登录

出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行

git:x:1001:1001:,,,:/home/git:/bin/bash

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出