笔者没有较为系统的学习过 Linux shell,正巧最近有一个比较神奇的事情。有两个 Github 账号,一个用于放置一些杂物,这个博客放在另一个账号上。但是本地 git 设置是那个放杂物的账号,push 的时候用 personal access token 强行 push,这样就导致那个主账号里的 commit 都是那个杂物账号提交的 :D 因此学一些 shell 语法来写一个脚本解决这个事情。

1. 管理 git 账号

personal access token 强行 push 的弊端是每个仓库都得新搞一个 token,如果使用一个通用 token 的话多少有点那个。

因此这里采用 SSH。很早年间发现 SSH 不起效的原因是没有使用正确的仓库名 git@github.com:用户名/仓库名.git。以前是直接用 https 的,所以不太行。

因此在本机设置好两个 SSH 即可。

2. 脚本

放到 ~/.local/bin 里。记得 chmod +x

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/usr/bin/env bash

# ====================== 配置区(请修改) ======================
readonly MAIN_NAME="你的主账号名字"
readonly MAIN_EMAIL="主账号邮箱@example.com"
readonly MAIN_HOST="github.com-main" # 对应 ssh config 里的 Host

readonly JUNK_NAME="你的杂物账号名字"
readonly JUNK_EMAIL="杂物账号邮箱@example.com"
readonly JUNK_HOST="github.com-junk"
# =============================================================

readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly CYAN='\033[0;36m'
readonly RED='\033[0;31m'
readonly NC='\033[0m'

show_current() {
echo -e "${CYAN}当前 Git 身份:${NC}"
echo -e " name : $(git config --global user.name 2>/dev/null || echo '未设置')"
echo -e " email: $(git config --global user.email 2>/dev/null || echo '未设置')"
}

# 把当前仓库的 remote 从 https 或普通 github.com 改成对应的 SSH Host
fix_remote() {
local host=$1
if [ ! -d .git ]; then
echo -e "${YELLOW}当前目录不是 git 仓库,跳过 remote 修改${NC}"
return
fi

local url
url=$(git remote get-url origin 2>/dev/null)
if [ -z "$url" ]; then
echo -e "${YELLOW}没有找到 origin remote${NC}"
return
fi

# 提取 用户名/仓库名
local repo
if [[ $url =~ github\.com[:/](.+)(\.git)?$ ]]; then
repo="${BASH_REMATCH[1]}"
repo="${repo%.git}"
else
echo -e "${RED}无法识别的 remote url: $url${NC}"
return
fi

local new_url="git@${host}:${repo}.git"
git remote set-url origin "$new_url"
echo -e "${GREEN}✓ origin 已改为: $new_url${NC}"
}

case "${1:-}" in
main|m)
git config --global user.name "$MAIN_NAME"
git config --global user.email "$MAIN_EMAIL"
echo -e "${GREEN}✓ 已切换到【主账号】${NC}"
show_current
# 如果在仓库里,顺便修 remote
fix_remote "$MAIN_HOST"
;;
junk|j)
git config --global user.name "$JUNK_NAME"
git config --global user.email "$JUNK_EMAIL"
echo -e "${GREEN}✓ 已切换到【杂物账号】${NC}"
show_current
fix_remote "$JUNK_HOST"
;;
status|s|"")
show_current
;;
*)
echo -e "${YELLOW}用法:${NC}"
echo " git-account main (或 m) → 切换到主账号(并修正当前仓库 remote)"
echo " git-account junk (或 j) → 切换到杂物账号(并修正当前仓库 remote)"
echo " git-account status (或 s) → 查看当前身份"
echo
show_current
;;
esac

Nothing built can last forever.
本站由 iznomia 使用 Stellar 1.30.4 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。