在CentOS下搭建Git服务器

By AYE 0

服务器端

第一步:安装git服务

【注】yum 源仓库里的 Git 版本更新不及时,最新版本的 Git 是1.8.3.1,但是官方最新版本已经到了 2.9.2。想要安装最新版本的 Git ,之恶能下载源码进行安装。

# yum info git //查看 yum 源仓库的 Git 信息

可以看出,截至目前,yum 源仓库中最新的 Git 版本才 1.8.3.1 ,而查看最新的 Git 发布版本,已经 2.9.2 了。

// 依赖库安装
# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
# yum install gcc perl-ExtUtils-MakeMaker

// 卸载低版本的 Git
# yum remove git

// 下载新版的 Git 源码包 (放在了 /usr/local/git 的目录下,git 是新建的目录)
# cd git
# wget https://github.com/git/git/archive/v2.9.2.tar.gz
# tar -xzvf v2.9.2.tar.gz

分别执行一下命令进行编译安装,编译过程可能比较漫长,请耐心等待完成。

# cd git-2.9.2
# make prefix=/usr/local/git all
# make prefix=/usr/local/git install

添加到环境变量

# vim /etc/profile

添加这一条: export PATH=/usr/local/git/bin:$PATH

# source /etc/profile    // 使配置立即生效
# git --version        // 查看版本号

将git设置为默认路径,不然后面克隆时会报错

# ln -s /usr/local/git/bin/git-upload-pack /usr/bin/git-upload-pack

# ln -s /usr/local/git/bin/git-receive-pack /usr/bin/git-receive-pack

创建一个git用户组和用户,用来运行git服务

# groupadd git
# useradd git -g git
# passwd git 

禁止该git用户使用shell登录系统(为了安全性,一般都禁止)

# vim /etc/passwd

找到类似下面的一行

git:x:502:502::/home/git:/bin/bash

改为

git:x:502:502::/home/git:/usr/local/git/bin/git-shell

保存并退出。

至此, git服务安装完成!

第二步:配置远程仓库

创建一个空仓库

# cd /home
# mkdir git
# cd git
# git init --bare LearnProject.git

到这里,空仓库已经创建成功,仓库的路径为:/home/git/LearnProject.git

通过 git init --bare LearnProject.git 建立的仓库是没有工作目录的,如需包含工作目录,请看注1。

为刚刚创建的用户git赋予权限

//chown -R 用户名:组名 文件
# chown -R git:git LearnProject.git

第三步:打开 RSA 认证

进入 /etc/ssh 目录,编辑 sshd_config

# cd /etc/ssh
# vim sshd_config

将下面几个的注释解开(带#为注释)

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

保存完成后,重启sshd服务

# /etc/rc.d/init.d/sshd restart

如果运行上述命令出现以下错误:

-bash: /etc/rc.d/init.d/sshd: No such file or directory

可以尝试以下命令:

# service sshd restart

或者

# systemctl restart sshd

至此,服务器端git配置完成。

客户端

第一步:配置git

安装git

傻瓜式安装

打开git bash创建git使用者
git config --global user.name "姓名"
git config --global user.email "邮箱"
创建与服务器通讯的密钥

在git bash中,输入一下命令,为自己的邮箱创建一个密钥

ssh-keygen -t rsa -C "邮箱"

一路enter下去

Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/***/.ssh/id_rsa):
Created directory '/c/Users/***/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/***/.ssh/id_rsa.
Your public key has been saved in /c/Users/***/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:F0NzRZYN3zMR5oGeOxuQE5LBwoKsEC8Un/0cl4SWk44 ***@******
The key's randomart image is:
+---[RSA 2048]----+
|.+o . . =o= .o*O.|
|o..oo. O.=.+ o+.=|
|o oo .=.oo+ + .+o|
| o   Eo.o  * o  o|
|       oS . o .  |
|         .   +   |
|              +  |
|             .   |
|                 |
+----[SHA256]-----+

这时候,系统已经为我们创建了一个公钥和密钥,id_rsa是密钥,不能告诉任何人,id_rsa.pub是公钥,可以公开。

将本地的公钥添加到服务器上
  • 通过客户端命令行将本地公钥添加进远程服务器中

在gitbash下,输入一下命令

ssh git@IP地址 'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
  • 手动将公钥添加到服务器中

找到id_rsa.pub文件,用编辑器打开,全选复制。

在服务器端,将复制的内容粘贴到authorized_keys文件中

注意文件路径:/root/.ssh/authorized_keys

# vim /root/.ssh/authorized_keys

通过以上两种方法,我们就将本地的公钥添加进服务器中了。如果发现该目录下没有 .ssh 文件,我们可以手动创建一个,并添加一个 authorized_keys 。

第二步:克隆远程仓库cd /vim

创建一个用于本地的git仓库文件夹,在文件夹内克隆远程仓库

git clone git@IP地址:端口/home/git/LearnProject.git
git clone ssh://root@IP地址/home/git/LearnProject.git

这时候,bash会提示你克隆的仓库是空的

Cloning into 'LearnProject'...
warning: You appear to have cloned an empty repository.

如果想使用 http 方式克隆,参考 使用nginx搭建http 访问的git服务器

至此,我们完成了远程仓库的克隆。

第三步:push/pull项目

做完以上服务器端/客户端各两步的内容,你的本地git已经可以和git服务器进行通信了,此时我们可以进行常规的项目push和pull了。

注1:建立包含工作目录的仓库

post-receive 实现自动同步到站点目录

如果你是用 git init --bare LernProject.git 建立的仓库,该仓库是没有工作目录的。

我们需要在该仓库的 hooks下,创建 post-receive 文件。

# cd LearnProject.git
# cd hooks
# vim post-receive

文件内容为:

#!/bin/bash
git --work-tree=/home/www checkout -f

保存退出后,设置权限

# chown git:git post-receive //将该文件用户及用户组都设置成git
# chmod +x post-receive //由于该文件是一个shell文件,应设置为可执行权限
创建支持工作目录的远程仓库
# git init <仓库名> 
# git config receive.denyCurrentBranch ignore //设置允许远程接收文件

在远程仓库 post-receive 钩子文件中添加自动更新工作目录内容

WORK_TREE='../'
git --work-tree="${WORK_TREE}" reset --hard

保存退出后,设置权限,同上文。

注2:git如何解决The authenticity of host can’t be established

新生成的密钥,git clone或者push的时候,有可能会报下面的错误:

The authenticity of host '148.70.59.85 (148.70.59.85)' can't be established.
ECDSA key fingerprint is SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.

文件夹内少了一个konwn_hosts文件,本来密钥文件应该是三个,现在只有两个,便报了这样的错误,此时输入yes回车之后,生成了缺少的konwn_hosts文件,便可解决这个问题。

Are you sure you want to continue connecting (yes/no)?  yes

Warning: Permanently added 'gitee.com,xxx.xxx.xxx.xxx' (ECDSA) to the list of known hosts.

ssh_packet_read: Connection closed

【参考】

Centos7搭建git服务器端

Git丨在CentOS下搭建私有的git服务器

搭建Git服务器遇到的那些坑

git clone 异常 fatal: Could not read from remote repository