暗黑模式
查看指定目录中所有Git仓库的状态
bash
#!/bin/bash
# 定义颜色
RED=$(tput setaf 1) # 红色
GREEN=$(tput setaf 2) # 绿色
YELLOW=$(tput setaf 3) # 黄色
NC=$(tput sgr0) # 恢复默认颜色
# 检查参数
if [ -z "$1" ]; then
echo "用法: $0 <目录路径> [递归层级数(默认=4)]"
exit 1
fi
# 将目录路径转换为绝对路径
DIR=$(realpath "$1")
MAXDEPTH="${2:-4}" # 默认 maxdepth 为 4
# 检查目录是否存在
if [ ! -d "$DIR" ]; then
echo "目录 $DIR 不存在,请检查路径。"
exit 1
fi
# 验证 maxdepth 是否为正整数
if ! [[ "$MAXDEPTH" =~ ^[0-9]+$ ]]; then
echo "递归层级数必须是一个正整数。"
exit 1
fi
# 输出表头
printf "%-60s | %-10s\n" "Repository" "Status"
printf "%-60s | %-10s\n" "------------------------------------------------------------" "----------"
# 使用 find 查找指定深度的目录中所有 .git 文件夹
find "$DIR" -maxdepth "$MAXDEPTH" -type d -name ".git" | while read -r git_dir; do
# 获取 .git 文件夹的父目录
repo=$(dirname "$git_dir")
cd "$repo" || continue
# 获取仓库状态
STATUS=$(git status --porcelain)
AHEAD=$(git rev-list --count @{u}..HEAD 2>/dev/null || echo 0) # 本地超前的提交数
BEHIND=$(git rev-list --count HEAD..@{u} 2>/dev/null || echo 0) # 远程超前的提交数
# 分析状态
if [ -z "$STATUS" ] && [ "$AHEAD" -eq 0 ]; then
# 无需 add, commit, push
printf "%-60s | ${GREEN}%-10s${NC}\n" "$repo" "Clean"
elif [ "$AHEAD" -gt 0 ]; then
# 需要 push
printf "%-60s | ${YELLOW}%-10s${NC}\n" "$repo" "Need Push"
else
# 有未提交的更改或其他需要操作
printf "%-60s | ${RED}%-10s${NC}\n" "$repo" "Changes"
fi
done
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