zoukankan      html  css  js  c++  java
  • git客户端同步到服务器--服务器自动部署项目之GitHooks神器

    (注: 引入  http://blog.csdn.net/wsyw126/article/details/52167147)

     总结小点:

    1、创建linux空仓库(详见“在 Linux 下搭建 Git 服务器”);

    2、在项目位置clone仓库,生成仓库名的项目;

    3、创建master分支(我的方式是git push  origin master一个文件后就自动生成,详见“git-bash的一些操作命令”);

    4、添加hooks(我用于本地window提交到服务器的仓库后,同步项目代码)。

    安装过程

    1. 在服务器上创建一个裸仓库(git服务器上的远端仓库)

      首先要在服务器上建立一个裸仓库,我存放裸仓库的文件夹是/home/workspace/gitbook,进入到该文件夹,然后使用git init –bare springSummary.git创建裸仓库。 
      在服务器上创建一个普通Git仓库

    2. 在服务器上建立一个普通Git仓库用于存放网站的源代码。(web服务器上的另一个本地仓库)

      mkdir /var/www/workspace
      cd /var/www/workspace
      git clone /home/workspace/gitbook/springSummary.git
    3. 配置Git Hook

      进入到/home/workspace/gitbook/springSummary.git/hooks文件夹,使用vi post-receive创建一个脚本,当你在本地仓库执行git push后就会触发post-receive。 
      post-receive的内容如下:

      
      #!/bin/sh
      #判断是不是远端仓库
      
      IS_BARE=$(git rev-parse --is-bare-repository)
      if [ -z "$IS_BARE" ]; then
      echo >&2 "fatal: post-receive: IS_NOT_BARE"
      exit 1
      fi
      
      unset GIT_DIR
      DeployPath="/var/www/workspace/springSummary"
      
      echo "==============================================="
      cd $DeployPath
      echo "deploying the test web"
      
      #git stash
      
      #git pull origin master
      
      git fetch --all
      git reset --hard origin/master
      
      #gitbook build
      #sleep 15
      
      time=`date`
      echo "web server pull at webserver at time: $time."
      echo "================================================"
    4. 保存后赋予可执行权限:

      chmod +x /var/www/workspace/springSummary/hooks/post-receive
    5. 这样在开发者提交代码的时候,就会自动部署。

      在这里需要解释两个问题:

      1. 在这里第一个问题,因为我部署的是一个gitbook项目,所以需要额外在脚本中添加一行指令gitbook build,但是仅添加这一行的话会导致最后这个脚步执行失败,因为build需要大约8秒时间。所以我的解决方案是在脚本中添加sleep 15,这样可以等待build执行结束并把结果返回到显示的终端。(如果只是需要自动更新项目,请把这两行指令删去)
      2. 在这里我使用的是git fetch,为什么没有用git pull实现。区别在于:

        1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge。
        2. git pull:相当于是从远程获取最新版本并merge到本地。
        3. pull实现相当于fetch后再用merge,来合并本地和远端的代码。

        这里就有个问题,如果开发者在提交过程出现失误,使用git reset复位后,现在远端的代码版本低于web端的代码版本,再使用pull的时候就不能实现和开发者本地的代码的同步。所以这里使用fetch后,在强制使用reset实现web端的代码版本指针和git服务端的一致。(如果在本机可以使用stash,然后pull,然后drop刚才stash的内容)

      

    问题解决:

    1、git pull 报错:error: insufficient permission for adding an object to repository database .git/objects

    解:找到项目里面的文件   sudo chmod 777 -R .git/objects

  • 相关阅读:
    CSS样式
    Python宏观
    javaScript----------(函数)
    vue-----5计算属性
    python之函数作用域、嵌套以及闭包
    python之函数的定义、传参以及动态参数
    python之文件操作
    基础数据类型的补充以及深浅copy
    小数据池、代码块以及编码转换
    python基础二
  • 原文地址:https://www.cnblogs.com/makeinchina/p/8038615.html
Copyright © 2011-2022 走看看