快捷创建分支同步远端脚本

# 功能描述

工作中常常一个需求要改动多个项目,每个项目都要创建一个分支,然后推送远端。这个脚本就是为了简化这个过程。

# 代码

#!/bin/bash

function gnb {
  # 确保输入正确
  if [ $# -lt 2 ]; then
    echo "用法:gnb <新分支名> <目录1> [<目录2> ...]"
    return 1
  fi

  # 检查用户是否在正确的目录中
  if ! git rev-parse --show-toplevel >/dev/null 2>&1; then
    echo "请在 Git 仓库中运行此命令。"
    return 1
  fi
  for arg in "${@:2}"; do
    (
      if cd "$arg"; then
        echo "进入目录 $arg"
      else
        echo "目录不存在: $arg"
        return 1
      fi
      # 检查是否存在远程分支
      git fetch origin
      if git rev-parse --quiet --verify "origin/$1" >/dev/null; then
        echo "远程分支 'origin/$1' 已存在,请选择其他名称。"
        return 1
      # 不存在分支时 返回非0值,但是这种情况其实是我们想要的,所以手动return 0 以免后面的判断退出了循环
      else return 0
      fi
    )
    if [ $? -ne 0 ]; then
      cd "${dir}"
      return 1
    fi
  done


  for arg in "${@:2}"; do
    (
      cd "$arg" 
      echo "进入目录 $arg"

      # 切换到主分支并拉取最新代码
      git checkout master && git pull

      # 创建新分支并推送到远程仓库
      if git checkout -b "$1"; then
        git push --set-upstream origin "$1"
      else
        echo "'$arg' 无法创建分支 '$1'"
        return 1
      fi
    )
  done
  cd "${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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

# 使用方法

使用控制台进入一个项目目录,执行 gnb <新分支名> <目录1> [<目录2> ...] 即可。

# 总结

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

  1. "$#" 获取参数个数
  2. "$@" 获取所有参数
  3. "${@:2}" 获取除第一个参数外的所有参数, shell 中一种特殊的参数展开方式,表示展开从第 2 个参数开始到最后一个参数的所有参数列表。可以把它看作是 ${parameter:offset:length} 的一种简化形式,在这里 parameter 就是 $@。 具体而言,当使用 ${@:2} 时,shell 会把 $@ 展开为参数列表,然后从中取出下标为 2 到最后一个参数的所有参数,并作为一个新的列表返回。因此 ${@:2} 表示的就是从第二个参数开始到最后一个参数的所有参数。
  4. git rev-parse --show-toplevel 获取 git 仓库的根目录,可以用来判断是否在 git 仓库中
  5. git rev-parse --quiet --verify "origin/$1" 当要新建一个分支时,先检查远程分支是否存在
  6. 对于每个文件夹,我们可以启动子 shell,以便不必更改当前目录。这样可以避免对当前 shell 进行任何更改。启动子 shell 的方法是使用小括号而不是大括号。小括号会创建一个子 shell,而大括号不会。这里又引入了另一个问题:子shell不满足情况时,需要跳出循环,并在父shell中执行回到原目录的操作。在子shell中执行 return 会退出子shell,还需要再执行return 1,才能退出父shell。
上次更新: 2023/06/28, 10:38:27
最近更新
01
go-admin-ui项目仿写练手1-登录页
06-29
02
maven依赖问题
06-17
03
JVM相关命令
02-21
更多文章>