Git pre-push 检查“当前分支”是否落后于“main”
-
背景
在开发新需求的时候,我们会基于 main
分支 checkout 出来 feature
分支,但是这个过程中可能有同学已经 merge 了新的代码。
那么问题来了,有些时候由于自己的疏忽或者任务紧急,可能上一次开发完,上线前的代码可能落后于 main
分支,如果后期不发现,那么上线的应用就不是完整代码的应用。
怎么解决呢?我们要及时 rebase main
的最新代码,保证代码不会落后。这个时候就可以借助 git 命令实现自动化检查,当不符合要求时,代码会被禁止 push 到远程仓库。
-
安装本钩子,防止没有及时合并
main
代码
-
修改
package.json
{
"husky": {
"hooks": {
"pre-commit": "lint-staged",
+++ "pre-push": "bash git_pre_push.sh",
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
}
},
}
-
写入钩子文件
#!/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/main"
echo -e "\033[0;34m >>----- 当前核查仓库路径 $ {CURRENT_PATH} -----<< \033[0m"
# 检查 “origin/main” 分支是否存在,如果存在,更新远端记录并比较是否存在落后提交
git rev-parse --verify $ {REFERENCE_BRANCH} > /dev/null 2>&1
if [ "$?" == "0" ]; then
git fetch origin
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}", 请合并最新的 main 分支代码\n \033[0m"
git-log-flat-colored $ {REFERENCE_BRANCH} | head -" $ {NB_COMMITS_BEHIND}"
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
-
举个 🌰
-
当前分支包含 main 分支所有提交记录:feature-0514-success-cxl
-
当前分支落后于 main 分支:feature-0514-fail-cxl
转载自:https://juejin.cn/post/7209919510723559485