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每次一登录就自动退出