GitHub虽好,但是私有空间收费,有些暂时还不想发布的程序或文件就只能本地保存,无奈之下还是自己在 VPS 上打一个 Git 服务器私人使用。整体流程比较简单,很快就能完成,写在这边方便以后查阅。

目前许多主机商预装的 Centos 系统都会自带 Git,目前自用的 Vultr 预装了git-v1.8.3.1,狗爹和阿里云预装的系统也有。

1.安装依赖库

其实如果是预装 Git 的系统可以直接跳过此步骤,不过以防万一可以升级或者安装一次。

# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
# yum install  gcc perl-ExtUtils-MakeMaker

2.确定git安装版本

首先使用git –-version或者yum list installed查看系统预装 Git 版本,查得应该是v1.8.3.1

然后查看 yum 源仓库的 Git 信息。截至目前,yum 源仓库中最新的 Git 版本才 1.8.3.1(很久没有更新了),而最新 Git 发布版本已经 2.15.1 了。(2017-12-25)

3.安装最新版Git

强迫症患者看到不是最新版无法忍受,所以先卸载本地旧版 Git。

# yum remove git

下载、解压最新版 Git。(最新版在此

# cd /usr/local/src/
# wget https://github.com/git/git/archive/v2.15.1.tar.gz
# tar zxvf v2.15.1.tar.gz

或者自行下载到本地电脑再上传解压。
编译安装,过程可能比较漫长,耐心等待完成。

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

添加到环境变量.

# echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/bashrc
# source /etc/bashrc # 实时生效

至此,安装完毕,查看一下版本号。

# git --version
git version 2.15.1

4.安装Git报错解决方法

现在我们在升级高版本的 Git 时可能会出现以下错误,主要是高版本中调用了不少字符转码的库,查了一下资料基本解决问题。

# 安装报错:
LINK git-credential-store
libgit.a(utf8.o): In function `reencode_string_iconv':
/usr/local/src/git-2.15.1/utf8.c:463: undefined reference to `libiconv'
libgit.a(utf8.o): In function `reencode_string_len':
/usr/local/src/git-2.15.1/utf8.c:502: undefined reference to `libiconv_open'
/usr/local/src/git-2.15.1/utf8.c:521: undefined reference to `libiconv_close'
/usr/local/src/git-2.15.1/utf8.c:515: undefined reference to `libiconv_open'
collect2: ld returned 1 exit status
make: *** [git-credential-store] Error 1

第一步:下载libiconv

cd /usr/local/src/
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
tar -zxvf libiconv-1.14.tar.gz
cd libiconv-1.14
./configure --prefix=/usr/local/libiconv  &&  make  && make install

注意!!!注意!!!

第二步:libiconv编译报错

源码编译安装 libiconv 时容易出现以下错误,如果没有出现请直接跳转至“第三步”。

# 编译报错
In file included from progname.c:26:0:
./stdio.h:1010:1: error: ‘gets’ undeclared here (not in a function)
_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
^
make[2]: *** [progname.o] Error 1
make[2]: Leaving directory `/usr/local/src/zabbix-2.4.7/libiconv-1.14/srclib'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/usr/local/src/zabbix-2.4.7/libiconv-1.14/srclib'
make: *** [all] Error 2

找到 libiconv 目录下/srclib/stdio.in.h

vi ./srclib/stdio.in.h
# 注释掉698这一行
/*_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");*/

# 在原处添加下面3行代码
#if defined(__GLIBC__) && !defined(__UCLIBC__) && !__GLIBC_PREREQ(2, 16)
 _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
#endif

# 注意下面还是有一个原有的#endif

重新执行 libiconv 的编译安装。

./configure -prefix=/usr/local/libiconv  &&  make  && make install

第三步:创建一个软链接到/usr/lib

ln -s /usr/local/lib/libiconv.so /usr/lib
ln -s /usr/local/lib/libiconv.so.2 /usr/lib

第四步:回到 Git 处继续编译

cd /usr/local/src/git-2.15.1
make configure
./configure --prefix=/usr/local/git --with-iconv=/usr/local/libiconv
make
make install

第五步:添加 Git 软连接

ln -s /usr/local/bin/git /usr/bin/

至此应该算彻底安装成功,输入git --version查看版本得git version 2.15.1

5.Git相关配置

到上一步 Git 安装已经完成,接下来是进行一些初始化配置。

1.创建用户组和用户

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

$ groupadd git
$ adduser git -g git #添加git用户,名称可以自己设置,不一定要用git
$ passwd git #修改git用户的密码

这里git的密码是用于客户端git上传下载身份验证要的,如果需要用密钥登录可以用下面的的方式

2.创建证书登录

代码仓库是放在了/home/git/目录下,用于存放验证密钥的.ssh/也要存在/home/git/之下。
收集所有需要登录的用户的公钥,公钥存放在客户端id_rsa.pub文件中,一行一个,在本地创建时可以设置或选择默认存放路径。

首先查看本地是否存在ssh key,如果有会列出key的列表。

$ ls -al ~/.ssh
# Lists the files in your .ssh directory, if they exist

如果没有公钥可以在本地打开git bash创建:

# -t 指定密钥类型,默认即 rsa ,可以省略
# -C 设置注释文字,比如你的邮箱,主要用于区分多个账户commit
# 全选默认设置,连按3次回车即可
ssh-keygen -t rsa -C "youremail@example.com"

一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

接下来将公钥id_rsa.pub上传到服务器~/git/.ssh/authorized_keys文件中即可,注意修改权限。

$ cd /home/git/
$ chmod 700 .ssh
$ touch .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys
$ chown -R git:git /home/git/.ssh  #设置目录和目录下的authorized_keys文件的拥有者和群组

3.禁止ssh shell登陆

出于安全考虑,git用户不应该被允许直接登录shell。这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:

git:x:1001:1001:,,,:/home/git:/bin/bash
# 改为:
git:x:1001:1001:,,,:/home/git:/usr/local/bin/git-shell

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

4.配置客户端git config

每次登录都要输入密码显得比较麻烦,所幸 ssh 支持配置客户端的公钥至 Host 上支持免密码登录。

大致的流程是,在 Client 端配置私钥和上文中的 user 关联起来,同时将 Client 的私钥对应的公钥分发存储至 Host 上 user 的主目录下,Host 就可以利用数字签名来验证 Client 是可信的,并使用 user 登录系统。(推荐多用户使用,单用户也可以使用以减少输入)

首先在Client端查看一下已有配置,打开git bash输入git config --list查看。
之后编辑~/.ssh/config(git bash 安装在其他盘符的话自行使用Everything搜索ssh_config所在位置进行修改)加入我们自己的配置。

$ vi ~/.ssh/config
# 添加config示例如下
Host vpsgit # 别名
    HostName  域名或ip
    User git # 登陆服务器用的账号
    Port 端口号(默认22,可以不填,如果服务器修改了 ssh 登录端口号,此处需要修改)
    IdentityFile ~/.ssh/vpsgit
    # 密钥文件的位置一定要对应准确,默认可不填,多用户可用于指定密钥

5.建立远程仓库

初始化项目版本库。

$ cd /home/git/repo
# project为项目名称
$ git init --bare project.git
$ chown -R git:git project.git

6.本地克隆仓库

$ git clone vpsgit:project.git # 此处就体现出使用config的简洁性了
Cloning into 'project'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.

至此整个服务器端的 Git 搭建算彻底完成,Enjoy Coding!!

参考 & 感谢

CentOS 7 安装最新的 Git
cetnos下编译安装Git最新版
git升级、安装时出错,utf8.c:463: undefined reference to `libiconv'
源码编译安装 libiconv-1.14 报:./stdio.h:1010:1: error: