快捷合并分支并推送远端脚本

# 功能描述

工作中是多个项目组合开发,所以每次要进入到dev分支的项目路径不同

例如在开发项目路径下:

--future
----server(单独git项目 xxx分支)
----web(单独git项目  xxx分支)
1
2
3

用于合并到测试分支的项目路径:

--merge
----server(单独git项目 dev分支)
----web(单独git项目  dev分支)
1
2
3

每次在开发分支完成工作后,都要切换到dev分支,合并代码,推送远端。为了避免切分支时代码变动过大导致IDEA卡顿,所以单独有个文件夹下放dev分支代码。所以每次都是先在项目分支推送远端,然后切换到dev路径下合并代码,再推送远端。于是给这部分流程写到脚本中,在命令行一行搞定。

# 代码

#!/bin/bash

function gmerge {
  local start_dir=$(pwd)
  local path=${start_dir}
  local folderName="${path##*/}"
  local branch=$(git rev-parse --abbrev-ref HEAD)
  local mergeFolder="../../merge/${folderName}"

  echo "推送代码"
  git push || { echo "推送代码失败"; cd "${start_dir}"; return 1; }

  echo "当前路径:${path}"
  echo "当前分支:${branch}"
  echo "当前文件夹名:${folderName}"
  
  echo "切换到目录 ${mergeFolder}"
  cd "${mergeFolder}" || { echo "目录不存在: ${mergeFolder}"; cd "${start_dir}"; return 1; }
  
  echo "拉取代码"
  git pull || { echo "拉取代码失败"; cd "${start_dir}"; return 1; }
  
  echo "合并分支 origin/${branch}"
  if git merge "origin/${branch}"; then
    echo "推送代码"
    git push || { echo "推送代码失败"; git merge --abort; cd "${start_dir}"; return 1; }
  else 
    echo "合并冲突,回滚合并"
    git merge --abort
    cd "${start_dir}"
    return 1
  fi
  
  echo "回到目录 ${start_dir}"
  cd "${start_dir}"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

# 使用方法

使用控制台进入一个项目目录,执行 gmerge 即可。

# 总结

通过编写这个脚本,我学到了的 shell 知识:

  1. folderName="${path##*/}" 获取路径最后一个文件夹名

${parameter##word} 是一种 Bash shell 中的参数替换语法,其中 ## Bash shell 中的字符串操作符。

该操作符的作用是从变量 parameter 中删除最长的匹配 word 的子串,并返回剩余的字符串部分。其中,parameter 表示需要进行操作的变量,word 表示需要匹配的子串,## 表示从变量开头开始匹配并删除最长的匹配 word 的子串。

与之相对的${path%/},它的作用是从变量 path 的值中删除从末尾开始最短的匹配 / 的子串,并返回剩余的字符串部分。如果 path 的值以 / 结尾,则会删除这个 /

举个例子,假设 path=/home/user/project/src/index.js,那么 ${path%/} 的结果是 /home/user/project/src,即删除了结尾的 /

上次更新: 2023/05/26, 15:49:03
最近更新
01
go-admin-ui项目仿写练手1-登录页
06-29
02
maven依赖问题
06-17
03
JVM相关命令
02-21
更多文章>