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...

相关推荐
int WINGsssss12 小时前
Git使用
git
用户07605303543814 小时前
Git Revert:安全移除错误提交的方式
git
Good_Starry1 天前
Git介绍--github/gitee/gitlab使用
git·gitee·gitlab·github
云端奇趣1 天前
探索 3 个有趣的 GitHub 学习资源库
经验分享·git·学习·github
F_D_Z1 天前
【解决办法】git clone报错unable to access ‘xxx‘: SSL certificate problem:
网络·git·网络协议·ssl
等风来不如迎风去2 天前
【git】main|REBASE 2/6
git
艾伦~耶格尔2 天前
IDEA 配置 Git 详解
java·ide·git·后端·intellij-idea
云兮杜康2 天前
IDEA中用过git之后文件名颜色全变红
java·git·intellij-idea
睡不醒的小泽2 天前
git merge 和 git rebase
git
艾伦~耶格尔2 天前
Git 下载及安装超详教程(2024)
git·gitee·码仓