git管理和自动部署项目

当一个项目须要归入到版本控制的时候,选择的工具仍是比较多的,最多见的就是工具备CVS,SVN,GIT等。在平时的开发中视状况而定,历来就没有最好的版本控制工具,只有最适合的工具。在这里我习惯用git来管理本身的项目,固然以前使用svn管理的,可是当用了git工具就不肯意再用其它的工具来管理。这里除了习惯以外,git的不少功能是svn不具有的,最简单的就是离线提交,用git管理的项目你会发现整个项目的大小变化不大,不像svn那样每一个目录又有一个.svn 的目录,并且会使项目的变得很大。关于git与svn的区别这里就不详细讲解了,请参考(git与svn区别)。php

GIT项目管理html

  1. GIT 工具的下载
    • windows 平台下能够直接到 git for windows 上下载和安装,另一种方式就是直接到 github    上搜索一个项目直接clone,按照引导流程你在windows上一样也安装了git,前提是你有github 帐号。
    • Linux 平台下,想RedHat,ubuntu,centos 上都不同,能够直接到网上搜索,以Ubuntu 为例,能够直接用 apt-get install git 就能够安装 git 了。
  2. git 操做(以ubuntu 平台为例)
    • 对于git的操做,或者是对于git的学习,直接下载 progit  这本书,里面包含了对git的详细讲解,让你对git有一个全面的认识。在这里我总结下本身认为比较重要的几个部分。
      • git 的基本操做,包括从初始化一个版本到归入本地管理以及把本地的项目push到git远程仓库中。以及对于提交版本的跟踪,日志的查看等。一样在参考这本书的同时,对于有疑问的地方也能够从到网上查找。
      • 对于服务器上的git的了解,包括对于git支持的协议的了解,最经常使用的就是 ssh 协议,像github 这种source code 的托管网站采用的是https协议,如何在git服务器上对多个开发者有效的管理,经常使用的工具就是gitosis, 能够参考 ubuntu 服务器上搭建git
      • 理解git 的分支(本地分支和远程分支),git合并代码的方式 merge 和 rebase 的理解。在这部分须要本身在本地反复的实验,从根本上理解两者的操做,优缺点等,关于这方面的文章也不少,能够参考 git rebase 简介基本篇
      • 最后若是有兴趣,能够对git的原理一探究竟,其实你能够把git理解为是一套内容寻址文件系统,理解git 是如何实现分支的,若是记录每一次提交的快照,是如何存贮这些版本的信息,git 有多少个对象,以及能够尝试用git底层提供的命令来完成对一个项目的管理。
  3. 有了上面的基础,你能够根据本身或者是团队的需求对项目进行版本控制。

 GIT 项目自动部署python

对于自动部署咱们先虚拟一个应用场景,就是你的代码仓库是位于A服务器上,你的项目运行在B服务器上,这里与WEB项目为主。假设全部开发人员把开发代码往A服务器上提交完以后,但愿代码会自动跟新到B服务器上。这样就省去了人工部署项目的步骤,并且服务器上永远都是最新的代码。这里须要强调的是A服务器上的仓库初始化能够有2种方式,那就是,git init 和 git init --bare ,对于这2种区别能够参考 git init & git init --bare difference  这里简单的介绍一下,就是用git init 初始化是带有工做目录的(work tree),也就是能够看到一个完整的项目,用--bare 就只能git相关的文件,没有 work-tree 。这2种初始化方式取决于你的应用场景,值得注意的是 若是你采用 git init 初始化,那么须要修改 ,.git/config 这个文件,让它容许往这个仓库推送代码。linux

 [receive]
denyCurrentBranch = ignore

 这里实现自动部署有2中方案,以Linux平台为例:git

  1. 你能够借助shell脚本和cron job 来实现,也就是先编写一个脚本,这个脚本的功能就是从git 仓库下载,而后完成部署。而后编写定时任务让没间隔一个小时去到服务器上下载一次代码。代码以下:
    #!/bin/bash
    
    if [ -f "deploy.lock" ] ; then
    git pull origin master
    else
    git init
    git remote add origin git@server_ip:demo.git
    git pull origin master
    BASE_DIR="/var/www/html/demo"
    chown -R demo:www-data $BASE_DIR
    find -type d -exec chmod 750 {} \;
    find -not -type d -exec chmod 640 {} \;
    chmod u+x deploy.sh
    touch deploy.lock
    fi

    这里以demo这个用户为例,到远程的服务器上下载最新的代码,而后完成一系列部署,这里须要说明的是 ubuntu 下 apache 默认及时用www-data 这个用户和用户组为www-data 来管理项目的,这里咱们把项目的全部者修改为demo 这个用户,用户组任然是www-data。这个脚本完成以后就能够把该脚本添加到定时任务中,这里就不讲解定时任务了,能够参考 PHP定时任务实现    。这样作的缺点就是不实时,优势就是容易控制。github

  2. 另一种就是借助git自己的所提供的钩子函数 hooks funciton , 这里就把脚本写在git 的 post-receive 阶段,该脚本位于 项目的hooks 目录下,默认脚本的后缀都是以.simple 结尾的,只要把.simple 去掉就启用了该脚本。这里须要说明的是用户权限的问题。由于git仓库的默认用户和全部者都是git这个用户,那么hook脚本也是会被git这个用户调用的,因此首先确保git这个用户能够下载本身仓库的代码。项目下载同时须要配置.git/config这个文件,表示让git忽略权限:
    [core]
            filemode = false
    其次apache项目运行的全部者和用户组都是www-data , 须要把项目的全部者修改成git这个用户,把git这个用户加入到www-data 这个用户组,此时hook这个脚本才会被git这个用户正确的调用,post-receive脚本的内容以下:
    #!/bin/sh
    #GIT_DIR=$(git rev-parse --git-dir 2>/dev/null)
    unset $(git rev-parse --local-env-vars)
    cd /var/www/html/demo || exit
    echo "git status info:"
    git status
    echo "***************************"
    git pull origin master
    echo "--- Done! ---"

    当这个脚本完成以后,只要代码提交到A服务器上,A服务器上立马执行钩子函数,代码就会从A服务器上项目的master分支自动跟新到B服务器上(运行环境上),这样就完成了自动部署。这里比较重要的就是用户权限的问题。shell

DONE!apache

相关文章
相关标签/搜索