美文网首页代码改变世界Linux终极玩家IT在线课程
Linux搭建GIT服务器并实现hook同步到指定目录

Linux搭建GIT服务器并实现hook同步到指定目录

作者: 四月不见 | 来源:发表于2017-12-08 22:09 被阅读141次

    (注:我的服务器是Ubuntu 16.04.3 LTS 64)

    一、在服务器上安装git

    sudo apt-get install git

    安装完成之后,可运行“git --version”查看安装版本,能看到git版本信息则说明已经安装成功。

    二、添加git用户

    有一些操作系统会在你安装git时会同时帮你创建一个git用户,但Ubuntu的需要我们手动来创建。这也非常简单的,那我们就来手动创建一个git用户:

    sudo adduser git  #输入密码,然后其它信息默认直接回车就行。

    三、在服务器上创建裸仓库

    你也可以一条命令完成上面的操作:

    git --bare init carcartalk.git

    裸仓库里面只保存了一些配置信息和你的版本库文件等,但是看不到我们所上传的文件或代码的,这就是裸仓库的特点。我们只需要能够从裸仓库里clone代码到你的本地就行。

    其实裸仓库的内容也就是我们正常git仓库里面的隐藏文件夹.git里面的内容

    四、在本地克隆服务器上的裸仓库

    我的客户端是windows,我已经安装好git了。windows上的git安装非常简单,上网直接百度一个git的exe文件安装就行。如果没有的话,我这里也可以推荐一个git的下载链接:https://git-scm.com/downloads,点击打开,选择windows版本直接下载安装即可,和所有的windows软件安装一样,这里我就不特别说明了。

    严格来说,其实Git并没有所谓的服务器端和客户端,这也是Git和SVN最大的一点不同。不管你在哪里创建了一个git仓库,原理上它都可以充当一个git服务器,这取决于你的配置。深入了解就涉及到很多git的原理知识了,感趣兴的同学可以自行去学习,当然,我也非常推荐你这样去做。

    好了,我又扯远了,回到主题

    克隆刚刚在服务器创建的裸仓库到本地:

    git clone git@服务器ip:/home/git/project/carcartalk.git carcartalk

    然后输入你的git用户的密码,你将会看到一个如下的“warning”提示,即说明你已经完成了克隆到本地的任务。

    warning: You appear to have cloned an empty repository.

    注意:很有可能你会在这个步骤收到一个权限不足的错误,这很有可能是因为git用户对你的服务器端的git仓库目录权限不足的原因,这里你只要把仓库的所属用户及用户组都改为git即可。

    chown git:git -R /home/git  #正常来说,如果你是在git用户的主目录下创建仓库则不会出现该问题。

    这里可能你还有一个疑问,如果我不知道git用户的密码呢?这该怎么办?(因为把git的密码告诉别人,那么他就可能会登录上你的服务器。)

    其实有两种办法可以解决这个问题,(1)可以登录你的root用户,设置git用户不可登录服务器,这样你把git密码透露出去也相对没那么危险,但我还是推荐下一种方法;(2)通过验证客户端秘钥来实现不需要密码进行git代码管理(等下我会在文章最后面拿这种方法来讲解,这个方法用起来会相对方便很多,非常适合开发。)

    五、测试使用

    克隆了远程仓库到本地后,你可以先进行一些简单的测试操作,确保你的git能正常使用,如下:

    touch readme.txt

    git add readme.txt

    git commit -m"first commit"

    git push origin master  # 在服务器端没有配置秘钥之前,每次push都要输入密码

    第一次push可能会有一些提示,因为裸版本库还什么都没有,你可能需要 git push origin master写全命令,之后就没必要了,直接 git push 就可以了。

    六、设置git钩子

    就比如一个web服务器,当我们在本地把开发好的代码文件push到服务器时,只是把更新提交到了你一开始在服务器创建的裸仓库中。此时你还需要进入你的web目录把更新的代码文件pull到你的指定目录,这样明显非常的不方便。这也不是我们想要的结果,这时候就是到git的钩子发辉作用的时候了。git钩子可以帮你解决你以上提出的问题。

    下面开始我们的设置。

    进入我们的裸仓库的hooks文件夹,然后新建一个post-receive文件。

    cd hooks/

    vim post-receive

    在post-receive写入以下内容:

    #!/bin/bash

    git --work-tree=/www/carcartalk checkout -f

    其中/www/carcartalk为你实际需要同步的站点目录。

    然后修改post-receive为可执行文件(其实这就是一个脚本文件)

    chmod +x post-receive

    post-receive的原理就是,当远程仓库发现有用户执行了push操作,就会执行一个脚本post-receive(钩子)。其实git还提供了很多其它动作的钩子,这里我们就不深入了解了。

    注意:同时你还需要修改你的web站点目录的权限,修改所属用户与用户组为git,否则钩子的权限可能会不足而导致执行失败。(你也可以通过添加git用户到相应的用户组来解决问题)

    chown git:git -R /www    # 修改所属用户

    设置好钩子后,当你本地再次执行push的时候,你会发现你web目录的文件也同步的更新了。

    到这一步,我们的“Linux搭建GIT服务器并实现hook同步到指定目录”教程算是已经讲解完了。哈哈,聪明的人肯定还记得前面遗留的一个问题,嗯嗯,就是关于公钥验证的问题。

    内容比较多,我下面就单独用一个小节来讲解。

    七、配置公钥验证方式

    在配置了公钥验证之后,当你再次从本地更新代码到服务器时,将不会再提示输入密码。

    1)服务器设置

    查看你的git用户目录下是否存在一个文件.shh,如果没有的话则自己手动创建。

    mkdir .ssh

    然后在.ssh文件夹里面新建一个文件authorized_keys

    touch .ssh/authorized_keys

    等下会用到这个文件,我们需要分别将其他开发者的公钥(全选、复制、不能更改!)添加到该文件去,一个开发者的公钥分一行。

    2)查看客户端的公钥(linux)

    cd ~/.ssh

    ls -al  #如果列出了authorized_keys、id_rsa、id_rsa.pub 则证明你拥有公钥。

    如果你的主目录里没有上述的文件,那么你可以通过运行 ssh-keygen 程序来创建它们。

    ssh-keygen

    首先 ssh-keygen 会确认密钥的存储位置(默认是 .ssh/id_rsa),然后它会要求你输入两次密钥口令。如果你不想在使用密钥时输入口令,将其留空即可。

    之后你就会在你的根目录下生成下图所示的文件:

    这里我们需要的就是id_rsa.pub文件里面的内容,也就是你的公钥。里面内容如下:

    把它复制,然后提交给git服务器的管理员进行相关配置。

    如果你的客户端是windows,那么查看公钥的方法如下:

    3)查看客户端的公钥(Windows)

    在 Windows 上,该程序包含于Git 软件包中。打开你的git命令行,输入

    ssh-keygen.exe    #创建公钥

    由于我的本地之前已经创建过密钥,所以得到如上图的结果。

    然后根据你创建时提示的实际路径即可找到你的公钥文件,windows一般都是放在C:\Users\Administrator\.ssh中。接下来就和上面一样,把你的公钥文件id_rsa.pub提供给git管理员。

    4)服务器配置

    打开在上面第1)步创建的文件authorized_keys,然后把第2)或第3)步提供给你的公钥粘贴到该文件。注意!如果有多个开发者需要受权,则你需要把他们的公钥都拷贝到这个文件,每个公钥需要单独占一行!

    5)测试

    此时,当你再次向git服务器push的时候,将不会再弹出需要输入密码的提示,如上图。

    感谢阅读!

    相关文章

      网友评论

        本文标题:Linux搭建GIT服务器并实现hook同步到指定目录

        本文链接:https://www.haomeiwen.com/subject/peasixtx.html