背景:
快速迭代开发下,每天需要对几个工程的代码进行合并操作,1、2个还好,要是多了就很麻烦,非常花时间,而且都是重复劳动;所以这里整理了一个shell脚本可以一键对代码进行更新、比对、合并提交等。
这里不过多解释,自行查看下脚本就知道怎么用了。
脚本代码
#!/bin/bash
BRANCH_PRE='v1.0.1'
BRANCH_PRE_BUGFIX='FIX-v1.0.1'
BRANCH_TARGET='v1.0.2'
PROJECT_LIST=("project_name_1" "project_name_2")
# 本地项目目录
WORKSPACE_DIR="/d/git_workspace/"
GIT_PATH="git"
VIM_PATH="/usr/bin/vim"
PARAM_PREFIX="param:"
# 获取gitlab的项目ID
resultGetGitProjectId=""
getGitProjectId() {
local projectName=$1
echo "${projectName}"
if [ "${projectName}" == "project_name_1" ]; then
resultGetGitProjectId="111"
elif [ "${projectName}" == "project_name_2" ]; then
resultGetGitProjectId="112"
else
resultGetGitProjectId=""
fi
}
# 切换分支函数
switch_to_branch() {
local target_dir=${WORKSPACE_DIR}"/"$1
echo "目录:${target_dir}"
cd $target_dir
# 更新远端分支信息
echo "版本:${BRANCH_PRE}"
git fetch
# 获取当前分支名称
current_branch=$(git branch --show-current)
# 检查当前分支是否为BRANCH_PRE
if [ "$current_branch" != "${BRANCH_PRE}" ]; then
# 如果不是BRANCH_PRE分支,则切换到BRANCH_PRE分支
# 尝试切换到BRANCH_PRE分支,如果本地不存在,则创建并跟踪远端分支
if ! git checkout ${BRANCH_PRE}; then
git checkout -t origin/${BRANCH_PRE}
fi
else
echo "已经在${BRANCH_PRE}分支上"
# 拉取分支最新代码
echo ">>>>>>>>>拉取分支最新代码(pull/fetch)-注意冲突情况"
git pull
fi
}
# 保护旧的分区
protected_branch() {
# 保护分支
getGitProjectId $1
echo ">>>>>>>>保护分支:$1 - ${resultGetGitProjectId} - ${BRANCH_PRE}"
targetUrl="https://[git_address]/api/v4/projects/${resultGetGitProjectId}/protected_branches?name=${BRANCH_PRE}&push_access_level=40&merge_access_level=40&unprotect_access_level=40"
curl --location --request POST --header "PRIVATE-TOKEN: 【your_token】" "${targetUrl}"
}
# 创建新分区
create_new_branch() {
local target_dir=${WORKSPACE_DIR}"/"$1
echo "目录:${target_dir}"
cd $target_dir
# 切换到原分支
git checkout $BRANCH_PRE
# 检查是否存在目标分支(本地或远程)
echo ">>>>>>>创建新的分支"
branch_exists=$(git branch --list $BRANCH_TARGET) || $(git branch -r --list origin/$BRANCH_TARGET)
# 如果目标分支不存在
if [ -z "$branch_exists" ]; then
# 从基础分支创建新的目标分支
git checkout -b $BRANCH_TARGET
echo "分支 $BRANCH_TARGET 已基于 $BRANCH_PRE 创建"
# 将分支push到服务器上
git push -u origin $BRANCH_TARGET
else
echo "分支 $BRANCH_TARGET 已存在"
fi
}
# 创建BUGFix分支
create_new_branch_bugfix() {
local target_dir=${WORKSPACE_DIR}"/"$1
echo "目录:${target_dir}"
cd $target_dir
# 切换到原分支
git checkout $BRANCH_PRE
# 检查是否存在目标分支(本地或远程)
echo ">>>>>>>创建新的分支"
branch_exists=$(git branch --list $BRANCH_PRE_BUGFIX) || $(git branch -r --list origin/$BRANCH_PRE_BUGFIX)
# 如果目标分支不存在
if [ -z "$branch_exists" ]; then
# 从基础分支创建新的目标分支
git checkout -b $BRANCH_PRE_BUGFIX
echo "分支 $BRANCH_PRE_BUGFIX 已基于 $BRANCH_PRE 创建"
# 将分支push到服务器上
git push -u origin $BRANCH_PRE_BUGFIX
else
echo "分支 $BRANCH_PRE_BUGFIX 已存在"
fi
}
# 比较版本是否有需要更新的,这个会更新两个版本
diffFlag=""
diff_current_to_target() {
local target_dir=${WORKSPACE_DIR}"/"$1
echo "目录:${target_dir}"
cd $target_dir
echo "GIT比较:${BRANCH_TARGET} ${BRANCH_PRE}"
# 拉取所有远程分支的最新代码
git fetch
# 更新旧的分支代码
git checkout ${BRANCH_PRE}
git pull
# 更新新的分支代码
git checkout ${BRANCH_TARGET}
git pull
# 使用...比较,找到TARGET和CURRENT共同的祖先,然后CURRENT中修改内容跟TARGET做比较
diffRes=$(git diff --stat ${BRANCH_TARGET}...${BRANCH_PRE})
if [ -z "$diffRes" ]; then
echo "没有差异"
else
echo "存在差异需要合并 $diffRes"
diffFlag="1"
fi
}
# 自动将旧分支合并到新分支上(旧的分支存在BUG修复,修复完需要合并到新分支上)
merge_current_to_target() {
local target_dir=${WORKSPACE_DIR}"/"$1
echo "目录:${target_dir}"
cd $target_dir
git fetch
echo "将分支${BRANCH_PRE}合并到${BRANCH_TARGET}"
diff_current_to_target $1
if [ -z "$diffRes" ]; then
echo "没有差异,不需要合并"
else
echo "存在差异需要合并 $diffRes"
branch_exists=$(git branch --list $BRANCH_TARGET)
# 如果目标分支不存在
if [ -z "$branch_exists" ]; then
echo "目标分支不存在:${BRANCH_TARGET}"
else
if [ -z "$diffFlag" ]; then
echo "没有差异不需要合并"
else
# 切换到目标分支
git checkout $BRANCH_TARGET
# 尝试合并$BRANCH_PRE到当前分支
git merge $BRANCH_PRE --no-edit
# 检查是否存在冲突
if git ls-files -u | grep -q '^'; then
echo "合并存在冲突,请手动解决后再提交。"
exit -1
else
# 没有冲突,提交合并
git commit -am "GIT Shell Auto Merge"
# 推送到服务器
git push origin $BRANCH_TARGET
fi
fi #END-Diff差异判断
fi #END-目标分支判断
fi
}
# 检查分支是否有修改
check_log_today() {
local target_dir=${WORKSPACE_DIR}"/"$1
echo "目录:${target_dir}"
cd $target_dir
# 更新远端分支信息
echo "版本:${BRANCH_PRE}"
git fetch
# 获取当前分支名称
current_branch=$(git branch --show-current)
# 检查当前分支是否为BRANCH_PRE
if [ "$current_branch" != "${BRANCH_PRE}" ]; then
# 如果不是BRANCH_PRE分支,则切换到BRANCH_PRE分支
# 尝试切换到BRANCH_PRE分支,如果本地不存在,则创建并跟踪远端分支
if ! git checkout ${BRANCH_PRE}; then
git checkout -t origin/${BRANCH_PRE}
fi
git pull
else
echo "已经在${BRANCH_PRE}分支上"
# 拉取分支最新代码
echo ">>>>>>>>>拉取分支最新代码(pull/fetch)-注意冲突情况"
git pull
fi
git log --since=midnight --pretty=oneline
}
# 循环工程列表处理GIT,最好是保证本地代码都已经stash或者commit了
case "$1" in
update)
for project in "${PROJECT_LIST[@]}"
do
echo "------------------更新:$project---------------------"
switch_to_branch ${project}
echo ""
echo ""
done
;;
protected)
for project in "${PROJECT_LIST[@]}"
do
echo "------------------保护:$project---------------------"
protected_branch ${project}
echo ""
echo ""
done
;;
create)
for project in "${PROJECT_LIST[@]}"
do
echo "------------------创建新分支:$project---------------------"
create_new_branch ${project}
echo ""
echo ""
done
;;
create_bugfix)
for project in "${PROJECT_LIST[@]}"
do
echo "------------------创建BUGFIX分支:$project---------------------"
create_new_branch_bugfix ${project}
echo ""
echo ""
done
;;
diff)
for project in "${PROJECT_LIST[@]}"
do
echo "------------------比较:$project---------------------"
diff_current_to_target ${project}
echo ""
echo ""
done
;;
merge)
for project in "${PROJECT_LIST[@]}"
do
echo "------------------合并:$project---------------------"
merge_current_to_target ${project}
echo ""
echo ""
done
;;
today)
for project in "${PROJECT_LIST[@]}"
do
echo "------------------当日是否有修改:$project---------------------"
check_log_today ${project}
echo ""
echo ""
done
;;
*)
echo "Usage: xxx.sh {update|protected|create|diff|merge}" >&2
exit 1
esac