美文网首页Android开发Git奇技淫巧Android技术知识
Git学习之路途 - 检查“打包分支”落后于“master”多少

Git学习之路途 - 检查“打包分支”落后于“master”多少

作者: 拔萝卜占坑 | 来源:发表于2019-05-24 18:21 被阅读5次

    知识点

    • git rev-list ,git rev-parse,git symbolic-ref
    • shell脚本

    场景

    当一个需求开发完成后,测试通过并上线,这时会把代码合并到master分支上,等下一次需求来的时候,重新从master建立新的分支进行开发。开发完,打包测试,上线。那么问题来了,有些时候由于自己的疏忽或者任务紧急的时候,可能上一次开发,上线后没有把代码合并到master就从master建立新分支进行新需求开发,如果后期不发现,那么上线的应用就不是完整代码的应用。那怎么解决呢?那么这个时候就可以借助git命令实现自动化检查,当不符合要求时,自动停止打包,并可以发送邮箱什么的给相关人员。

    git rev-parse

    主要用于操纵的辅助管道命令,比如:打印给定修订说明符的SHA1哈希值。

    • –verify
      验证指定的对象是否存在有效的git对象,比如下面命令:

      git rev-parse --verify <分支名> > /dev/null 2>&1
      

      “git rev-parse --verify <分支名>”输出分支最近的一条commit提交的SHA1哈希值,然后输入到空设备文件,不打印出来。如果执行出错也输入到空设备文件。如果我们访问的仓库不存在,那么将会把错误信息重定向到空设备文件。

    git symbolic-ref

    阅读,修改和删除符号引用。通过下面命令来获取当前分支名

    git symbolic-ref --short -q HEAD
    
    1. --short:短格式输出
    2. -q: 如果命令执行出错,不打印错误信息。
    3. HEAD:当前分支的头指针

    git rev-list

    以反向时间顺序列出提交对象
    eg1:

    git rev-list foo bar ^baz
    

    列出所有可以从foo分支或bar分支访问,但不能从baz分支访问的提交,即罗列出“foo分支”或者“bar分支”里除去“baz分支”里有的提交。

    那么有了这个用法,是不是可以找出“master”有的提交,但是“打包分支”没有的提交。

    eg2:

    git rev-list origin..HEAD
    git rev-list HEAD ^origin
    

    着两个命令等价,都是列出“当前分支”有的,但是“origin”没有的提交
    eg3:

    git rev-list A B --not $(git merge-base --all A B)
    git rev-list A...B
    

    merge-base找到A B的父节点,即列出A B中不包含A B父节点的所有提交。

    1. --left-only,--right-only,--left-right来列出左边,右边,或者左右的符合的提交。
    2. --count返回提交的数量,比如左边有多少条提交符合条件。

    实现

    主要要切换到分支目录执行shell脚本

    • 获取当前分支名
      git symbolic-ref --short -q HEAD
    • 获取当前分支的顶层目录,即.git所在目录
      git rev-parse --show-toplevel
    • 检查master分支是否存在
       git rev-parse --verify origin/master > /dev/null 2>&1
        //$?上个命令的退出状态,或函数的返回值。
       if [ "$?" == "0" ]; then
           存在
       else
           不存在
      
    • 更新远端提交记录
      git fetch origin
    • 获取“master”包含,但“当前分支”不包含的提交条数。
      NB_COMMITS=$(git rev-list --left-right --count origin/master...@ | cut -f1)
      

    @指代当前的分支,“|” 将左边的输出作为右边的输入,cut -f1获取输入的左边的第一个参数。
    “git rev-list --left-right --count origin/master...@”这个命令执行会返回master和当前分支包含当父节点不包含的提交数。

    if [ "${NB_COMMITS}" -gt "0" ]; then
        有NB_COMMITS提交落后
    else
       包含master所以提交
    

    完整代码

    #!/bin/bash
    
    git-log-flat-colored() {
     git --no-pager log --format="%C(yellow)%h%Creset %C(cyan)%cd%Creset %s %Cgreen%an%Creset" --date=short "$@"
    }
    
    CURRENT_FEATURE=`git symbolic-ref --short -q HEAD`
    CURRENT_PATH=`git rev-parse --show-toplevel`
    REFERENCE_BRANCH="origin/master"
    
    echo -e "\033[0;34m >>-----当前核查仓库路径${CURRENT_PATH}-----<< \033[0m"
    
    echo
    
    # 检查 “origin/master” 分支是否存在,如果存在,更新远端记录并比较是否存在落后提交
    git rev-parse --verify ${REFERENCE_BRANCH} > /dev/null 2>&1
    if [ "$?" == "0" ]; then
    
       echo -e "\033[0;34m >>-----${CURRENT_FEATURE}-----<< 更新远端提交记录... \033[0;34m"
       git fetch origin
    
       echo -e "\033[0;35m >>-----${CURRENT_FEATURE}-----<< 检查当前分支是否包含 \"${REFERENCE_BRANCH}\" 分支所有提交记录 \033[0m"
       NB_COMMITS_BEHIND=$(git rev-list --left-right --count ${REFERENCE_BRANCH}...@ | cut -f1)
       
       if [ "${NB_COMMITS_BEHIND}" -gt "0" ]; then
         echo -e "\033[0;31m >>-----${CURRENT_FEATURE}-----<< 当前分支有 ${NB_COMMITS_BEHIND} 个提交落后于 \"${REFERENCE_BRANCH}\", 请合并最新的 master 分支代码\n \033[0m"
         git-log-flat-colored ${REFERENCE_BRANCH} | head -"${NB_COMMITS_BEHIND}"
         echo -e "\033[0;33m \n >>-----${CURRENT_FEATURE}-----<< 你可以通过 \"git merge origin/master\" 来合并代码 \033[0m"
         exit 2
       else
         echo -e "\033[0;32m >>-----${CURRENT_FEATURE}-----<< 完美,当前分支包含 ${REFERENCE_BRANCH} 分支上的所有提交记录 \033[0m"
       fi
    
     else
    
       echo -e "\033[0;31m >>-----不能比较,检测${REFERENCE_BRANCH}不存在-----<< \033[0m"
       exit 2
    
    fi
    
    echo
    

    相关文章

      网友评论

        本文标题:Git学习之路途 - 检查“打包分支”落后于“master”多少

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