背景
项目分支比较多的时候,在临时分支开发完代码,要一个个的合并代码,过程很繁琐,希望把这个过程自动化
工具的作用是:
在临时分支开发完代码,执行git commit之后,会自动向指定的分支,进行merge操作,并push到远程仓库,一切都完成之后,会回到临时分支。
能够省去 git checkout,git pull,git merge,git push 再 git checkout .... 这些操作。
细节:
可选:只有git commit 内容带AM(可以自定义)字符的时候才会触发自动化流程,否则,不会触发,和普通的commit一样。
自定义:可以指定自动合并分支的列表,会依次去这些分支执行一系列操作
防呆防错: 可以指定排除的分支列表,在这些分支下,永远不会触发这个自动化流程
应用:
适用于项目分支比较多的情况,我用在法律法规项目上(这个项目有两个测试分支,每次合并代码,重复步骤多。)
实现
新建git钩子脚本: 在项目的.git/hooks文件夹中新建post-commit文件(shell脚本,没有后缀名),内容如下:
shell
#!/bin/sh
# 日志记录函数
Log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
# 获取项目根目录路径
PROJECT_ROOT=$(git rev-parse --show-toplevel)
Log "自动化流程开始..."
# 获取当前分支名称
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
# 定义需要排除的分支列表
EXCLUDE_BRANCHES=("release" "dev" "dev-test")
# 获取最新的提交信息
LAST_COMMIT_MESSAGE=$(git log -1 --pretty=%B)
# 检查提交信息中是否有 AM 标记
if [[ "$LAST_COMMIT_MESSAGE" =~ AM ]]; then
RUN_DEPLOY=true
else
RUN_DEPLOY=false
fi
# 检查当前分支是否在排除的分支列表中,并且是否包含 [deploy] 标记
if [[ ! " ${EXCLUDE_BRANCHES[@]} " =~ " ${CURRENT_BRANCH} " ]] && [ "$RUN_DEPLOY" = true ]; then
Log "检测到提交到临时分支 $CURRENT_BRANCH,包含AM,开始自动化流程..."
powershell -File "$PROJECT_ROOT/AM.ps1" -TempBranch "$CURRENT_BRANCH"
elif [ "$RUN_DEPLOY" = false ]; then
Log "未检测到标记,跳过自动化流程。"
else
Log "当前分支是 ${CURRENT_BRANCH},跳过自动化流程。"
fi
创建自动化脚本: windows环境下,在项目根目录 新建powershell自动化脚本 - AM.ps1
powershell
# 定义参数
param (
[string]$TempBranch,
[string]$DevBranch = "dev",
[string]$DevTestBranch = "dev-test",
[string]$RemoteRepo = "origin"
)
function Log {
param (
[string]$message
)
Write-Output "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] $message"
}
# 检查是否提供了临时分支名称
if (-not $TempBranch) {
Log "error: temp banch name is not found"
exit 1
}
# 检查是否在正确的分支上
$CURRENT_BRANCH = git rev-parse --abbrev-ref HEAD
if ($CURRENT_BRANCH -ne $TempBranch) {
Log "error: current branch is not $TempBranch"
exit 1
}
# 提交更改
git add .
if (-not (git diff-index --quiet HEAD --)) {
git commit -m "feat: auto push from $TempBranch change"
}
else {
Log "no change to push"
}
# 获取最新的远程dev和devTest分支
git checkout $DevBranch
git pull $RemoteRepo $DevBranch
git checkout $DevTestBranch
git pull $RemoteRepo $DevTestBranch
# 合并临时分支到dev和devTest分支
git checkout $DevBranch
git merge $TempBranch --no-ff -m "feat: auto merge $TempBranch to $DevBranch"
git checkout $DevTestBranch
git merge $TempBranch --no-ff -m "feat: auto merge $TempBranch to $DevTestBranch"
# 推送更新到远程仓库
Log "push $DevBranch ..."
git push $RemoteRepo $DevBranch
Log "push $DevTestBranch ..."
git push $RemoteRepo $DevTestBranch
git checkout $TempBranch
Log "over"