git bash批量切换多个项目git分支脚本

解决问题:

目前公司的工作流程是以任务为单位的,每个任务包含多个微服务项目,每个微服务对应每个任务都会创建一个分支。

如果一个人同一时间有多个任务开发,就可能需要来回切换,如果一个个去切换太麻烦了

解决方案:

对于每个任务准备一个文件,文件中记录的是当前任务的项目+分支,使用shell脚本+文件参数一次性切换任务分支

任务文件例子:

txt 复制代码
test1    dev    test master
test2    dev    test master

文件说明:

  1. 第一列是项目目录(当前目录到项目目录的相对路径),第二列开始是分支名,索引从1开始
  2. 文件格式不限
  3. 用#可以注释某行

shell脚本内容如下:

bash 复制代码
#!/usr/bin/env bash
# -*- coding: utf-8 -*-
#
# 一键切换分支
# @author: 徐宙
# @date: 2020-12-08
 
function success_log() {
  echo -e "\033[32m $* \033[0m"
}
 
function error_log() {
  echo -e "\033[31m $* \033[0m"
}
 
# 0 - 分支不存在
# 1 - 本地分支,无远程
# 2 - 远程分支
function get_branch_type() {
  # 判断远程分支是否存在
  if [ `git ls-remote --heads $(git remote | head -1) "$1" | cut -d$'\t' -f2 | sed 's,refs/heads/,,' | grep ^"$1"$ | wc -l` != 0 ]; then
    echo 2
  # 判断只存在于本地,没有远程的分支
  elif [ -z "%(git branch --list $1)" ]; then
    echo 0
  else
    echo 1
  fi
}
 
 
function swith_branch() {
  # 查看当前分支
  curr_br=`git symbolic-ref --short -q HEAD`
  target_br=$1
  # 如果分支相同无需切换
  if [ "$curr_br" = "$target_br" ]; then
    success_log "分支相同,无需切换"
    return 1
  fi
  # 如果有内容修改
  if [ -n "$(git status --porcelain)" ]; then
    error_log "** 有内容修改未提交,无法切换分支"
    error_log "** 请确认提交,或使用git stash保存空间之后,再切换分支"
    return 0
  fi
  git fetch
  success_log "切换分支到:$target_br"
  branch_type=`get_branch_type $target_br`
  if [ $branch_type = 0 ]; then
    error_log "** 分支不存在,请检查是否添加过分支"
    return 0
  fi
  git checkout $target_br
  curr_br=`git symbolic-ref --short -q HEAD`
  if [ "$curr_br" != "$target_br" ]; then
    error_log "** 切换分支失败,当前分支:$curr_br"
    return 0
  fi
  success_log "切换成功,当前分支:$curr_br"
  if [ $branch_type = 2 ]; then
    # 更新远程分支到本地
    git pull --rebase
  fi
  return 1
}
 
if [ $# -lt 1 ]; then
  error_log "Usage: cb.sh filename [branch_index]"
  error_log "example: cb.sh brach_list.txt"
  error_log "example: cb.sh brach_list.txt 2"
  error_log "brach_list.txt like this: "
  error_log "test1	dev	test master"
  error_log "test2	dev	test master"
  exit 1
fi
 
filename=$1
branch_index=$2
if [ -z "$branch_index" ]; then
  branch_index=1
fi
# 取当前目录
base_dir=`pwd`
# 遍历文件,每次处理一行
while read line || [[ -n $line ]]; do
  line=`echo $line | tr --delete '\n'`
  line=`echo $line | tr --delete '\r'`
  # 跳过以"#"号开头的行,可以注释某些行,更灵活
  if [[ -z "$line" ]] || [[ ${line:0:1} == "#" ]]; then
    continue
  fi
  success_log
  success_log "当前行:$line"
  # 根据空格或tab分割字符串
  arr=($line)
  # 第一个是项目
  project=${arr[0]}
  # 目标分支
  target_br=${arr[$branch_index]}
  # 打开文件夹
  cd $base_dir/$project
  success_log "当前目录:`pwd`"
  # 查看当前分支
  curr_br=`git symbolic-ref --short -q HEAD`
  success_log "当前分支:$curr_br"
  success_log "目标分支:$target_br"
  # 切换分支
  swith_branch $target_br
  success_log "-----------------------"
done < $filename

使用说明

1、可以使用git bash客户端,也可以使用cmder集成git bash使用(建议使用cmder,轻量级,支持多终端,多tab切换)

2、第一种:脚本放在特定位置(我放在用户目录的gitbash目录下),将该位置添加到环境变量path中

第二种:修改用户目录下的.bash_profile文件

bash 复制代码
vi ~/.bash_profile
alias cb='sh ~/gitbash/cb.sh'
source ~/.bash_profile

3、切换分支示例

bash 复制代码
cb refund.txt 

或者

bash 复制代码
cb refund.txt 1

注意:

本地文件有修改,会提示无法切换

有远程分支默认拉取远程,没有不拉取

补充说明

  1. 我的项目目录是在一起的,如果项目目录不在一起的,可以使用相对路径
  2. github仓库 github.com/yewyern/git... 代码分支:1.0
  3. gitee仓库 gitee.com/mayfool/git... 代码分支:1.0
  4. 脚本使用过程中,出现任何问题,或者有好的建议,欢迎留言或联系QQ:691573424

声明:以上内容均为本人原创,参考链接csdn:blog.csdn.net/shashengwan...

相关推荐
影视飓风TIM4 小时前
Linux下C语言缓冲区原理 + Git版本控制
linux·c语言·git
tianyuanwo10 小时前
当提交标题重复阻塞CI:Git分支修复实战
git·ci/cd·分支基线调整
Salt & Light10 小时前
Git 分支操作与恢复完整记录
git
重生的黑客10 小时前
从远程仓库到企业级协作:Git push、pull、PR、多人开发与分支模型
git·分支·多人协作
tianyu23413 小时前
Git 常用命令完整手册
git·版本控制·常用命令
gwf2161 天前
SSD读写速度深度解析:顺序读写vs随机读写、IOPS、延迟,你的硬盘性能到底怎么看?
git·嵌入式硬件·缓存·github·智能硬件
西邮彭于晏1 天前
图文详解:Git分支创建、合并与冲突解决|新手零门槛完整教程
大数据·git·elasticsearch
nuisthou1 天前
git常用命令总结
git
西邮彭于晏1 天前
Git 标签(Tag)与版本发布完整指南|附全场景命令速查表
大数据·git·elasticsearch
潘正翔1 天前
k8s进阶_Harbor镜像仓库
git·云原生·容器·kubernetes·gitee·github