Android开发Git奇技淫巧Android技术知识

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

2019-05-24  本文已影响5人  拔萝卜占坑

知识点

场景

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

git rev-parse

主要用于操纵的辅助管道命令,比如:打印给定修订说明符的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脚本

@指代当前的分支,“|” 将左边的输出作为右边的输入,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
上一篇 下一篇

猜你喜欢

热点阅读