1.前言
在上一篇讲述了如何在CentOS7上编译安装Subversion1.9.5和Apache2.4.25,并与Apache2.4.25集成,达到多个SVN版本库集中授权控制的效果。在传统的企业里面使用SVN来作为源代码版本工具的比例是比较高的,但在一些互联网企业里面很多已经在使用git来作为源代码版本管理工具了。网上关于SVN和Git的比较说明是很多的,其中最重要一个区别就是SVN是集中式的,git是分布式的,比如要查看版本库的历史提交记录,在SVN中必须要在能够连接到SVN服务器才可以,而在Git中则无需这么做,主要原因也是因为它是分布式的,只有需要与他们协同时才需要将代码提交到中央服务器或者从中央服务器下载到本地,在一般情况下可以本地提交。
本篇就是讲述如何在CentOS7下编译安装当前最新版本的Git。
2.准备
git-2.13.1.tar.gz:Git的Linux版本,下载地址:https://www.kernel.org/pub/software/scm/git/git-2.13.1.tar.gz,当然也可以在https://www.kernel.org/pub/software/scm/git/下载其它版本。
Git-2.13.1-64-bit.exe:Git的Windows下64位操作系统版本,下载地址:https://github.com/git-for-windows/git/releases/download/v2.13.1.windows.1/Git-2.13.1-64-bit.exe
Git-2.13.1-32-bit.exe:Git的Windows下32位操作系统版本,下载地址:https://github.com/git-for-windows/git/releases/download/v2.13.1.windows.1/Git-2.13.1-32-bit.exe
TortoiseGit-2.4.0.2-32bit.msi:TortoiseGit的32位Windows版本,下载地址:https://download.tortoisegit.org/tgit/2.4.0.0/TortoiseGit-2.4.0.2-32bit.msi
TortoiseGit-2.4.0.2-64bit.msi:TortoiseGit的64位Windows版本,下载地址:https://download.tortoisegit.org/tgit/2.4.0.0/TortoiseGit-2.4.0.2-64bit.msi
TortoiseGit-LanguagePack-2.4.0.0-32bit-zh_CN.msi:TortoiseGit的32位Windows版本的中文语言包,下载地址:https://download.tortoisegit.org/tgit/2.4.0.0/TortoiseGit-LanguagePack-2.4.0.0-32bit-zh_CN.msi
TortoiseGit-LanguagePack-2.4.0.0-64bit-zh_CN.msi:TortoiseGit的64位Windows版本的中文语言包,下载地址:
https://download.tortoisegit.org/tgit/2.4.0.0/TortoiseGit-LanguagePack-2.4.0.0-64bit-zh_CN.msi
在上述的7个文件中,仅需要将git-2.13.1.tar.gz放到CentOS7的/root目录下,而Git-2.13.1-64-bit.exe/Git-2.13.1-32-bit.exe和TortoiseGit-2.4.0.2-32bit.msi/ TortoiseGit-2.4.0.2-64bit.msi及TortoiseGit-LanguagePack-2.4.0.0-32bit-zh_CN.msi/ortoiseGit-LanguagePack-2.4.0.0-64bit-zh_CN.msi根据使用Windows系统的是32位还是64位来选择安装。
3.编译安装
3.1预备
在CentOS7的源中是自带有git的,也就是我们可以通过yum install来直接安装,但是自带的版本比较低,是git-1.8.3.1,我们可以通过yum info git查看,下图就是查看效果:
wKiom1lnM9GggzUtAABXUsL7c0A988.png-wh_50 
而在Git官方网站目前正式版已经到2.13了,为了体验最新版本的git,需要从官网下载源代码进行编译安装。

考虑到编译安装Git过程中会有一些对第三方库的依赖,因此先安装依赖库:
yum install asciidoc docbook2X xmlto texinfo sgml2xml autoconf openjade -y
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker -y

安装完成后,再卸载老版本的git:
yum remove git

wKiom1lnM-DSrNOSAABiV2tfW04024.png-wh_503.2编译安装Git-2.13.1
cd /root
tar -zxvf /root/git-2.13.1.tar.gz
cd /root/git-2.13.1/
make configure
./configure --prefix=/usr/local/git-2.13.1
make all doc
make install install-doc install-html
如果不出错的话,上面的命令就已经将git安装在/usr/local/git-2.13.1目录下了。

4.配置
4.1配置Git的环境变量
为便于今后执行git的相关命令,我们可以将git的安装路径信息添加到/etc/profile这个文件中,首先增加GIT_HOME环境变量:
export GIT_HOME=/usr/local/git-2.13.1
然后编辑PATH环境变量,增加Git的安装路径信息:
export PATH=$PATH: $GIT_HOME/bin
然后重新加载环境变量设置信息:
Source /etc/profile
可以使用如下命令检查配置是否正确:
git –version
which git
上面的第一条命令是查看当前git的版本的,第二条命令是查看在命令行中执行git相关命令时是执行在哪个目录下的可执行文件。
4.2创建Git运行的user和usergroup
在CentOS7下对git的一些目录和文件的权限设置要求很苛刻,本人曾出现过多次配置不成功的情况,为减少走弯路的情况,我们先创建一个git的user和usergroup,然后以这个user来配置git。以下是命令:
groupadd git
useradd git -g git
同时还需要设置git用户的登录密码:
passwd git
安装提示两次输入一致的密码即可完成git用户的密码设置。
为了保证git用户有足够的权限能够执行我们后面将要执行的命令,我们暂时将其添加到sudoer中(注意是暂时,配置完成后还是要去掉这一行的),使它可以以sudo的方式执行命令,具体做法是打开/etc/sudoers文件,在root用户那一行下将git用户添加进去,如下图所示:
wKioL1lnM_GwZjFLAABcXXTg17w681.png-wh_50 
注意,使用vim编辑/etc/sudoers文件时保存时需要使用”:wq!”来保存文件,而不是常用的”:wq”。
4.3配置git用户免密码登录
现在我们切换到git用户:
su git
现在我们可以通过ssh命令来登录本机了,命令如下:
ssh git@localhost
在第一次使用这个命令时会看到一个提示:
The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is aa:21:ce:7a:b2:06:3e:ff:3f:3e:cc:dd:40:38:64:9d.
Are you sure you want to continue connecting (yes/no)?
输入”yes”后就会要求输入git用户的登录密码,然后就通过ssh的方式登录到当前机器,如果想要退出ssh登录输入”exit”命令即可,如下所示:
[root@it ~]# su git
[git@it root]$ cd ~
[git@it ~]$ pwd
/home/git
[git@it ~]$ ssh git@localhost
The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is aa:21:ce:7a:b2:06:3e:ff:3f:3e:cc:dd:40:38:64:9d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
git@localhost's password:
Last login: Thu Jul 13 11:19:16 2017
[git@it ~]$ exit
logout
Connection to localhost closed.
[git@it ~]$

上面的操作中还是要求我们通过ssh方式登录本机时需要输入用户密码,通过下面的配置即可达到无密码登录。
以git用户身份执行ssh-keygen,在执行过程中一路回车即可,最终会在/home/git/.ssh目录下生成id_rsa和id_rsa.pub两个文件。
接着通过如下命令创建authorized_keys文件:
touch ~/.ssh/authorized_keys && chmod 600  ~/.ssh/authorized_keys
authorized_keys用于存放本机免密码登录的用户公钥,下一步就是通过下面的命令将刚才生成的公钥文件id_rsa.pub的内容放到authorized_keys文件中去:
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
这样设置以后,今后执行ssh git@localhost就无需再输入用户名和密码了。
4.4创建git版本库
通过如下命令创建git版本库的目录(注意使用su git切换到git用户来执行):
sudo mkdir /var/git
sudo chown -R git:git /var/git
cd /var/git
git init --bare test.git
执行git init --bare test.git命令时会看到如下输出:
Initialized empty Git repository in /var/git/test.git/
至此,我们已经一个git版本库,版本库的存放路径为/var/git/test.git。
5.检验配置
5.1安装Git-2.13.1.2
因本人的笔记本使用的Win7 X64系统,因此安装的是Git-2.13.1.2-64-bit.exe,按照软件默认设置一路Next即可。安装完成之后可以在开始菜单看到git的相关菜单。
5.2安装TortoiseGit及TortoiseGit-LanguagePack
因为Git-2.13.1.2仅提供了朴素简单的操作方式,为了便于操作建议安装TortoiseGit及TortoiseGit-LanguagePack.这里同样也是采用默认设置安装TortoiseGit及TortoiseGit-LanguagePack。
5.3Git客户端操作
5.3.1从服务器Clone版本库
这里以刚刚创建的test.git版本库为例。
在Windows系统中选择一个工作磁盘分区,点击鼠标右键,出现如下菜单:
wKiom1lnNBbyOd0EAABEitBYEoQ656.png-wh_50 
选择“Git Clone…”命令,出现如下菜单:
wKioL1lnNCSz0FVsAACJbeqfKio218.png-wh_50 
然后点击“OK”确认,弹出密码输入框,因为是以git这个账号登录的,所以需要输入的是刚刚创建git用户设置的密码,如下图所示:
wKiom1lnNDTyc0c-AACC1KdVbuM378.png-wh_50 
这里需要注意的是,如果没有正确设置将会看到如下错误信息:
fatal: protocol error: bad line length character: bash
git did not exit cleanly (exit code 128)
如下图:
wKiom1lnNELDx0QpAABm5oj7uBM935.png-wh_50 
出现这种情况的原因是没有正确设置git用户所使用的shell,默认情况下用户所使用的shell为/bin/bash,这里我们需要将其修改为/usr/local/git-2.13.1/bin/git-shell,上述信息在/etc/passwd中修改:
修改前:
git:x:1002:1002::/home/git:/bin/bash
修改后:
git:x:1002:1002::/home/git:/usr/local/git-2.13.1/bin/git-shell
修改正确后执行上述操作就不会报错了。通过上述设置后git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。
另外,我们在前面临时将git用户赋予了sudo权限,这时也可以取消这个权限设置了。
5.3.2提交代码到本地版本库
在本地Git工作文件夹内创建文件然后编辑文件内容,在文件夹上点击鼠标右键,在弹出菜单中选择“Git Commit -> “master””,如下图方式所示:
wKioL1lnNFHC_NLyAABdz4atgMg516.png-wh_50 
在弹出的对话框中选择要提交的文件并填写提交日志,如下图所示:
wKiom1lnNGLwi2W9AADHb3syN0c477.png-wh_50 
点击“Commit”即可完成向本地版本库提交,如下图所示:
wKioL1lnNHfyiDMhAABz7TNnG-s641.png-wh_50 
5.3.3提交代码到中央版本库
上面的操作仅仅是提交到本地的版本库,它适用于在本地要做一些预研性的工作,取得阶段性成果后可以阶段性提交,如果不满意可以在本地撤销提交。如果在一个开发团队中,完成了全部预研工作之后,是需要提交到中央版本库的,这样同一个团队中的其它成员才能获取到更新。
向中央版本库提交代码也很简单。在本地git工作文件夹上鼠标右键,依次选择“TortoiseGit -> Push…”,如下图所示:
wKiom1lnNIfic8rAAACdVbDvBmc625.png-wh_50 
然后弹出提交配置的界面,如下图所示:
wKioL1lnNJeTyquWAACPx7nEIkU606.png-wh_50 
点击“OK”后会要求输入git用户的登录密码,输入密码之后就会看到如下界面:
wKiom1lnNKiBjTbgAAB0Vw8rK0Y768.png-wh_50 
5.3.4查看提交历史
在git工作文件夹上点击鼠标右键,依次选择“TortoiseGit -> Show Log”就可以查看历次提交记录,如下图所示:
wKiom1lnNLjRamVBAAC4-qH14Og335.png-wh_50 

5.4注意事项
5.4.1TortoiseGit免密码提交问题
在Windows客户端也可以通过git原生程序提供的ssh-keygen程序生成id_rsa和id_rsa.pub文件,将id_rsa.pub导入到服务器上的~/.ssh/authorized_keys文件中,在使用原生的git提供的操作时可以免密码输入,但是使用TortoiseGit时却不行。如果要想在使用TortoiseGit时也无需输入密码,则需要将其生成的公钥导入到服务器上的~/.ssh/authorized_keys文件中。
具体步骤如下:
1.打开原生git自带的Git Bash命令,可以在开始菜单中选择“Git – Git Bash”。
2.在打开的命令行中输入“ssh-keygen”命令来生成用于git的公钥和私钥,按照默认设置是存放在当前用户的工作路径下的.ssh路径下,如本人Windows系统用户名为zhou.jin-qiao,生成文件路径为:C:\Users\zhou.jin-qiao\.ssh
3.打开TortoiseGit自带的PuTTYgen命令,可以在开始菜单中选择“TortoiseGit -PuTTYgen”,然后点击界面上的“Load”按钮,然后选择第二步生成的私钥,导入成功时会看到如下界面:
wKiom1lnNMnh0cPiAADl32yAr9Q481.png-wh_50 
4.点击“Save private key”按钮,将其保存到第2步中git存放公钥和私钥的路径,在本处是C:\Users\zhou.jin-qiao\.ssh,TortoiseGit使用的私钥带有ppk后缀。
5.将C:\Users\zhou.jin-qiao\.ssh\id_rsa.pub文件上传到CentOS7的tmp目录下,然后通过如下命令将公钥导入:
cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys
6. 打开TortoiseGit自带的Pageant命令,可以在开始菜单中选择“TortoiseGit -Pageant”,这个程序启动后默认最小化在系统托盘区域,鼠标右键点击图标,然后通过界面上的“Add Key”菜单导入第二步生成的私钥,这时再使用TortoiseGit对中央服务器版本库进行操作时就不需要输入用户密码了。
5.4.2Git的服务器配置问题
因为Git是Linux的作者开发Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件,这个软件是基于SSH协议的(注意是Secure Shell Protocol,而不是Spring+Struts+Hibernate),所以只要服务器运行了ssh监听程序git中央服务器就可以工作了,无需再额外配置。
6.总结
在本篇讲述了如何在CentOS7上安装并配置Git使之成为中央git服务器,然后演示了在Windows客户端如何与git中央服务器协同工作,里面还涉及到两个坑:一个是没有将git的shell改为git-shell导致操作时报“git did not exit cleanly (exit code 128)”错误的问题,另一个是在使用TortoiseGit无密码连接Git中央服务器的问题。至于git日常操作命令和流程大家可以去看网上相关教程。


声明:本文首发于本人个人微信订阅号:zhoujinqiaoIT,其后会同时在本人的CSDN、51CTO及oschina三处博客发布,本人会负责在此四处答疑。