笔者没有较为系统的学习过 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"
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 '未设置')" }
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 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
|