GIT更新合并Shell脚本

背景:

快速迭代开发下,每天需要对几个工程的代码进行合并操作,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



  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值