虚拟机搭建 Git 服务器

目录
[隐藏]

在虚拟机上搭建好了LAMP环境,接下来就需要将宿主机上的项目上传到虚拟机上去了,VirtualBox 提供了增强功能可以使 宿主机和虚拟机共享文件夹,然后还可以使用FTP上传文件,但前面一直在使用Git,也想更好的学习Git,就在虚拟机上搭建一个 Git 服务器吧。

虚拟机系统:CentOS7.3-1611.Minimal

Git版本:2.13.2

1、编译安装Git

开始想直接通过 yum install git 直接安装,但奈何从源获取的版本都太低了!那就手动编译安装吧。

要在Linux 上编译安装,当然得先有 gcc 这个编译工具了。 先查看下是否已经安装了gcc,

    执行:rpm -qa | grep gcc ,然后显示已经安装了一个gcc包:libgcc-4.8.5-11.e17.x86-64,显然这只是一个gcc需要库,gcc 实际上没有安装,所以说 CentOS7.3-1611.Minimal 默认是没有安装 gcc 的。这里直接用yum 安装了,执行:yum install gcc。

    如果没有gcc环境,那执行make 命令进行编译时会提示:/bin/sh: cc: command not found

1.1 安装 Git 依赖工具

Git 所需要依赖的工具有好几个,例如:curl、openssl、zlip、expat这些。所以需要先安装依赖工具,Minimal 版本这些一个都没有安装,所以我是一直报错提示然后再安装对应工具才完成的。。。

大致错误如上,都是#include<xxx/xxx.h> 文件找不到,安装对应的工具包即可解决。一个汇总的依赖工具如下:

      yum install curl-devel expat-devel openssl-devel zlib-devel gettext-devel

1.2 安装Git

首先从 Githup 上下载指定版本的Git 包吧。不同版本修改最后的包名即可

    wget https://githup.com/git/git/archive/v2.13.2.tar.gz

wget 会将下载的包放在当前目录下!所以如果不想多经历一次移动文件的过程,那就先切换到要放置的目录吧,再使用 wget 下载。

下载完成后,先要 .tar.gz 文件进行解压。好在 Minimal 版本中解压工具倒是安装了。

     tar -zxvf v2.13.2.tar.gz

解压后,会在当前目录下生成 git-2.13.2 的目录,里面就是一堆 .c .h 文件了。切换到 git-2.13.2 目录下准备安装吧。

    执行 make 编译命令之前,通常会先执行一个配置命令 ./configure ,用来检测平台环境。

    但执行该命令时却提示我 "找不到configure文件",纳尼?不是一般解压后都会在主目录生成configure这个命令么?没办法,先看看目录里面有没有configure文件吧。

    执行 ls | more,然后发现只有一个 configure.ac 的文件,那要怎么生成configure文件呢?先看看软件提供的安装说明吧,一般软件都会提供一个 README 或者 INSTALL 文件。

    执行 cat INSTALL | more ,发现有如下内容:

    上面两图就说明了,如何安装Git,要么直接执行 makemake install 命令。如果要执行配置命令,首先要 make configure 编译生成configure文件。

    那就先执行:make configure 吧,然而又有提示了,'autoconf command not found',原来Minimal版没有安装autoconf工具,那就先安装吧:yum install autoconf

    终于可以顺利的 ./configure --prefix=/usr/local/git 了,--prefix= 指明了安装路径。

    执行 make all ,一路都在编译,以为没问题了,然后问题就出现了,如下:

提示: usr/bin/perl Makefile.PL PREFIX='/usr/local/git' INSTALL_BASE='' --localedir='/usr/local/git/share/locale'
           Can't locate ExtUtils/MakeMaker.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5
            /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at Makefile.PL line 3.
            BEGIN failed--compilation aborted at Makefile.PL line 3.
            make[1]: *** [perl.mak] Error 2
            make: *** [perl/perl.mak] Error 2

    看上去像缺少了什么东西,百度后找到要安装的工具:yum install perl-ExtUtils-MakeMaker

    然后终于成功编译链接完了,执行 make install 搞定。

1.3 加入环境变量

    为了能在全局环境下执行 git 命令,所以需要将git 加入到环境变量中。有三种方式:

        <1>直接用 export 命令
            # export PATH=/usr/local/git/bin:$PATH (账户注销后失效)
        <2>在/etc/profile 文件最后加入设置环境变量 (所有用户有效)
            #软件名-版本
            export PATH=/usr/local/git/bin:$PATH
        <3>在用户主目录下的 .bash_profile 文件最后加入设置环境变量 (只对该用户有效)
            #软件名-版本
            export PATH=/usr/local/git/bin:$PATH
        然后重启系统,或者 source /etc/profile 使该文件生效

   Linux 中,环境变量中不同内容以 : 隔开,而不是Windows中以 ; 隔开。

   执行:git --version ,能看到版本信息,则Gi安装成功!

2、配置Git服务器

    简单说来,就是在虚拟机上创建一个远程仓库,然后让宿主机可以向这个远程仓库 push 或 fetch。通常来说会在服务器上添加一个专门用以管理Git仓库的用户和组

       groupadd git

       useradd -g git git

   第一步:新建一个目录作为远程仓库,远程仓库一般以 .git 结尾。

       mkdir  testgit.git

       git init --bare testgit.git   // --bare 选项表示只初始化一个裸仓库、不包括工作区(即push文件上来后看不到具体文件),所以如果仅仅只是用来上传文件使用,可以不加 --bare 选项,但是不加 --bare 选项,Git默认是不允许推送文件上来,后续会提到。

   第二步:改变远程仓库的所有者为 git 用户

       chown -R git:git   // -R 参数表示递归到所有子目录,即整个目录所有文件的所有者都修改为 git

       因为我们在本地向服务器推送数据时,肯定不会用到root等权限比较高的用户,一般就是使用git用户。

       如果没有修改,但推送数据时又使用的是git用户,就会出现权限问题了,如下图所示:

    
     这样Git服务器就已经准备好了,可以从宿主机上push上来了。

  第三步:测试从本地push到远程仓库

     这一步使用的是Windows下的 msysgit,向虚拟机上的远程仓库推送数据时,一定要指定使用 git 用户。即 git@192.168.43.20:/data/git/gitwork.git  这种形式,如果未指定用户,会使用当前Windows的用户,,,那这提示你输入密码时就很懵了,因为你虚拟机上没有Windows这个用户,怎么可能输入正确呢。

     执行:git push git@192.168.43.20:/data/git/gitwork.git  后会提示要输入git用户登录192.168.43.20的密码。输入正确后即可 push 完成。

2.1 问题及解决

      按前面的步骤,通常已经可以使用了。但还是遇到了一些问题:

      <1> bash: git-upload-pack(或者是 git-receive-pack ): command not found

              fatal: The remote end hung up unexpectedly

     百度后找到原因,是因为自定义安装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

     /usr/local/git  是我的安装路径, git 命令就在 /usr/local/git/bin 目录下,但你用git用户远程登录上传时,系统只会去 /usr/bin 目录下寻找相应的命令。

    <2>前面提到 如果初始化远程仓库没有使用 --bare 选项,则在推送时会出现一些问题,如下

    解决方法:设置下 receive.denyCurrentBranch=ignore 即可。

           git config receive.denyCurrentBranch=ignore
           或修改.git/config添加如下代码
                 [receive]
 
                        denyCurrentBranch = ignore
   推荐还是在初始化时带上 --bare 选项,不带这个选项仅限于自己来上传文件到服务器上玩玩。上传文件后,还得执行:git reset HEAD .   git checkout -- .  这两个命令,将文件反应到工作区。
  如果使用了git init初始化,则远程仓库的目录下,也包含work tree,当本地仓库向远程仓库push时,  如果远程仓库正在push的分支上(如果当时不在push的分支,就没有问题), 那么push后的结果不会反应在work tree上,  也即在远程仓库的目录下对应的文件还是之前的内容,必须得使用git reset --hard才能看到push后的内容。

至此的话,一个基于虚拟机的简单Git服务器就算搭建好咯,可以推送上去,也可以克隆或拉取下来。

3、免密登录Git服务器

每次用Git push或克隆,都要求输入 git 用户的登录密码,当密码比较多时可能容易忘记,可以使用 ssh 来实现免密登录Linux。msysgit 和 CentOS7.3-1611.Minimal 默认都安装了 ssh 工具。

原理是比较容易理解的:

    客户机生成自己的公钥和私钥啊,将公钥保存到服务器上,后续登录服务器时,服务器会根据主机名来匹配公钥,然后生成一个随机数并用该客户机的公钥进行加密,发送到客户机上后,客户机再用私钥解密得到随机数并发回服务器,服务器一比较就知道了。

    第一步:用GitBash 在客户端生成公钥和私钥

        执行:ssh-keygen -t rsa -C "youremail"   //后续会提示是否要对该ssh加密,直接回车两次即可。

        默认会在当前用户的主目录下生成一个 .ssh 的目录,该目录下有两个文件 id_rsa 和 id_rsa.pub 后者是公钥,前者是私钥。Windows下就是在 c:\Users\xxx\.ssh  目录下

   第二步:服务器开启RSA认证

        进入服务器的 /etc/ssh/sshd_config 文件中,将RSA认证打开

            RSAAuthentication yes

            PubkeyAuthentication yes

            AuthorizedKeyFile .ssh/authorized_keys

       可以看到公钥在服务器存放的位置是  .ssh/authorized_keys 文件中。所以在 /home/git/ 目录下创建 .ssh目录,然后创建 authorized_keys。再重启下ssh服务,这样服务器就准备好了。

   第三步:将客户端公钥保存到服务器端

        在客户端msysgit中执行:ssh-copy-id -i ~/.ssh/id_rsa.pub git@192.168.43.20 

        当然,这一次还是需要输入git用户的登录密码的。成功后,就可以直接使用 ssh git@192.168.43.20 登录到服务器而不用输入密码了。这样你在push或clone时也可以不用输密码啦。

        如果你使用别的用户,那还是要输密码的。

   第四步:禁止git用户shell登录!

        这里只是想让Git 推送数据时能不输入密码,但一般不会想让git用户能直接登录到服务器上进行操作。所以为了安全,不能允许 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每次一登录就会自动退出。

4、总结

    想要学习Git,建议看下廖雪峰的《Git教程》或者《Pro Git》,前者是一个速成模式,后者则更为全面细致对于深入了解Git很有帮助。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

To