知识点
- 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
- --short:短格式输出
- -q: 如果命令执行出错,不打印错误信息。
- 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父节点的所有提交。
- --left-only,--right-only,--left-right来列出左边,右边,或者左右的符合的提交。
- --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
网友评论