快捷创建分支同步远端脚本
# 功能描述
工作中常常一个需求要改动多个项目,每个项目都要创建一个分支,然后推送远端。这个脚本就是为了简化这个过程。
# 代码
#!/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
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 的知识:
"$#"
获取参数个数"$@"
获取所有参数"${@:2}"
获取除第一个参数外的所有参数, shell 中一种特殊的参数展开方式,表示展开从第 2 个参数开始到最后一个参数的所有参数列表。可以把它看作是 ${parameter:offset:length} 的一种简化形式,在这里 parameter 就是 $@。 具体而言,当使用 ${@:2} 时,shell 会把 $@ 展开为参数列表,然后从中取出下标为 2 到最后一个参数的所有参数,并作为一个新的列表返回。因此 ${@:2} 表示的就是从第二个参数开始到最后一个参数的所有参数。git rev-parse --show-toplevel
获取 git 仓库的根目录,可以用来判断是否在 git 仓库中git rev-parse --quiet --verify "origin/$1"
当要新建一个分支时,先检查远程分支是否存在- 对于每个文件夹,我们可以启动子 shell,以便不必更改当前目录。这样可以避免对当前 shell 进行任何更改。启动子 shell 的方法是使用小括号而不是大括号。小括号会创建一个子 shell,而大括号不会。这里又引入了另一个问题:子shell不满足情况时,需要跳出循环,并在父shell中执行回到原目录的操作。在子shell中执行
return
会退出子shell,还需要再执行return 1
,才能退出父shell。
编辑 (opens new window)
上次更新: 2024/11/09, 09:01:06