自己写了个 Git 账户切换工具 Git Switcher, 为啥非要做个工具 —— 既然觉得命令行切换麻烦,直接写个 shell 脚本不更简单?其实最开始我也是这么想的 —— 毕竟对天天用终端的人来说,脚本 + zsh 别名确实够快。但最后拐去做了 Flutter 桌面端,说起来还是「懒」和「想折腾」这两个念头在打架。

最初的想法:用命令行脚本解决「懒」

最开始被账户切换折磨时,我的第一反应是写个 shell 脚本。毕竟命令行才是「效率神器」:

  • 可以用 alias 定义快捷命令,比如 git-switch work 一键切工作账号,git-switch me 切个人账号,比点鼠标快多了。
  • 处理 SSH 配置也直接,脚本里用 sed 替换 ~/.ssh/config 里的 IdentityFile 路径,几行代码就能搞定。
  • 配合 zsh 的自动补全,连账号名可能都不用输全,按个 Tab 就出来了。

我甚至真的写了个雏形脚本,大概长这样(简化版):

1
2
3
4
5
6
# 切换 Git 用户名和邮箱
git config --global user.name "$1"
git config --global user.email "$2"

# 替换 SSH 配置里的密钥路径
sed -i '' "s|IdentityFile.*|IdentityFile $3|g" ~/.ssh/config

然后在 .zshrc 里配个别名:

1
alias gsw='source ~/scripts/git-switch.sh'

为什么放弃脚本,转头学 Flutter?

脚本用了两天,懒癌又犯了 —— 每次新增账号都要改脚本、记参数,对不熟悉命令行的朋友也不友好。更关键的是,我当时正想练 Flutter 的桌面端开发。

之前用 Flutter 只写过移动端 Demo,总觉得「跨平台」的卖点在桌面端才更有吸引力。但一直没找到合适的练手项目:太复杂的做不来,太简单的又学不到东西。而 Git 账户切换这个场景,刚好能覆盖桌面端开发的几个核心点:

  • 文件操作:读写 .gitconfig~/.ssh/config 这些系统文件,得处理不同系统的路径格式(Windows 的 C:\ 和 Linux 的 / 差异)。
  • 系统交互:最小化到托盘(用 tray_manager 库)、窗口大小控制(window_manager),这些都是桌面端特有的需求。
  • 用户体验:比如输入 SSH 密钥路径时加个「文件选择器」(用 file_picker 库),比脚本里手动输路径容错率高多了。

说白了,就是借着「解决自己的小麻烦」的名义,逼自己啃 Flutter 桌面开发的知识点。

现在回头看:脚本和 GUI 各有各的「懒法」

折腾出 Flutter 版本后,我偶尔还是会用脚本 —— 比如在服务器上临时切换账号时,一行命令确实比启动 GUI 快。但日常开发里,GUI 版用得更多:

  • 不用记参数,账号信息存在列表里,点一下就切换。
  • 自动备份配置这个功能,脚本里虽然能实现,但要写一堆判断逻辑,Flutter 里用 path_provider 找备份目录反而更直观。

当然,这本质上还是「个人习惯优先」。比如我写的 SSH 配置冲突检测(当检测到主机密钥路径不一致时弹窗提示),对熟手来说可能是多余的,但对我这种偶尔会手滑改错配置的人来说,就很实用。

最后还是那句大实话

这个工具从命令行脚本变成 Flutter 桌面端,一半是为了「偷懒」,一半是为了「练手」。代码里肯定有不少不严谨的地方 —— 比如处理配置文件时没考虑极端格式,状态管理用单例模式可能不够优雅。

但对我来说,能用它解决自己的日常问题,还顺便搞懂了用GitHub Action打包Flutter 桌面端的流程.

如果有人觉得命令行脚本更顺手,完全可以基于这个思路自己改;如果想用 GUI 但觉得功能不够,欢迎提 PR 一起完善。毕竟工具嘛,自己用着舒服最重要~

项目地址:https://github.com/voidbytes/git-switcher