一个用于管理和切换 Git 用户身份的 CLI 工具。
在日常开发中,开发者经常需要在个人项目和公司项目之间切换不同的 Git 身份:
- 个人开源项目使用
个人邮箱 - 公司内部项目使用
公司邮箱
手动修改 git config user.name 和 git config user.email 既繁琐又容易出错。gitusr 帮你把常用的 Git 用户身份保存起来,通过一条命令就能在仓库级别或全局快速切换,无需记忆复杂的 git config 语法。
此外,gitusr 还提供:
- 历史记录作者替换:当你发现历史提交中的作者信息有误时,可以安全地重写历史
- Hook 自动用户切换:安装 hook 后,
git clone结束会按优先级自动应用用户(显式--gu-*参数 > 仓库.gitusrrc>hosts规则 > 交互式选择);git commit和cd时会自动检测.gitusrrc配置并应用对应的 Git 用户身份 - 按 host 自动路由:通过
gitusr hosts配置 host 规则,例如github.com用个人账号、code.byted.org用公司账号,clone 时自动匹配
brew tap northwang-lucky/gitusr
brew install gitusr安装完成后,Homebrew 会自动将 gitusr 和快捷命令 gu 放入你的 PATH 中。
以下是一个从零到自动切换的完整演示,展示 gitusr 最核心的使用体验:
# 1. 初始化 —— 从当前 git 全局配置导入第一个用户
# (如果全局没有配置,会交互式提示输入)
gitusr init
# 2. 添加另一个用户(例如公司身份)—— 这是体验自动切换的前提
gitusr add
# 提示输入 user.name: Zhang San
# 提示输入 user.email: zhangsan@company.com
# 3. 安装 shell 钩子(bash + zsh)
gitusr hooks install
# 输出:
# 所有 hook 安装成功
# 请运行 'source ~/.bashrc' 以应用 bash hook
# 请运行 'source ~/.zshrc' 以应用 zsh hook
# 4. 使钩子在当前终端生效
source ~/.bashrc # 或 source ~/.zshrc
# 5. 克隆任意仓库 —— hook 会自动进入目录并调用 gitusr use
git clone https://github.com/example/repo.git
# clone 完成后自动进入 repo 目录。
# 如果有多个用户保存,会弹出交互式选择:
#
# ? 选择一个用户:
# 姓名:North Wang | 邮箱:north@personal.com
# 姓名:Zhang San | 邮箱:zhangsan@company.com
# 6. 查看当前仓库已切换的用户
gitusr current
# 输出:
# 您的 repo git 用户为:
#
# user.name = Zhang San
# user.email = zhangsan@company.com进阶:为仓库配置 .gitusrrc
在 Git 仓库根目录创建 .gitusrrc 文件,当 cd 进入该目录或 git commit 时,hook 会自动匹配并应用对应的 Git 用户:
{
"name": "Zhang San",
"email": "zhangsan@company.com"
}匹配优先级:email > name。只要提供其中一项即可。
- 所有命令均可通过
gitusr <command> --help查看帮助。 - 同时支持
gu作为快捷命令(例如gu list)。 - 数据文件默认保存在
$XDG_DATA_HOME/gitusr/user-list.json(回退到~/.local/share/gitusr/user-list.json)。 - 支持中英文双语,语言优先级:
GITUSR_LANG>LANGUAGE>LANG>en。
从当前 Git 全局配置读取 user.name 和 user.email,保存为第一个用户。如果检测到旧版配置文件(~/.gitusr/user-list.json),会提示迁移到 XDG 目录。
用法:
gitusr init [flags]标志:
| 标志 | 简写 | 说明 |
|---|---|---|
--force |
-f |
强制覆盖已存在的用户列表 |
--name |
-n |
非交互式指定用户名(必须与 --email 同时使用) |
--email |
-e |
非交互式指定用户邮箱(必须与 --name 同时使用) |
--yes |
-y |
跳过所有确认提示 |
示例:
# 交互式初始化
gitusr init
# 强制重新初始化
gitusr init --force
# 非交互式直接指定
gitusr init --name "North Wang" --email "north@example.com"交互式添加一个新的 Git 用户身份。支持通过 flag 非交互式添加。
用法:
gitusr add [flags]标志:
| 标志 | 简写 | 说明 |
|---|---|---|
--name |
-n |
指定用户名(非交互式,必须与 --email 同时使用) |
--email |
-e |
指定用户邮箱(非交互式,必须与 --name 同时使用) |
示例:
# 交互式添加
gitusr add
# 提示输入 user.name: North Wang
# 提示输入 user.email: north@example.com
# 非交互式添加
gitusr add --name "North Wang" --email "north@example.com"在当前 Git 仓库或全局范围内切换已保存的用户。支持通过索引、姓名或邮箱定位用户;如果未指定且只有一个用户,直接切换;如果有多个用户,会进入交互式选择。
用法:
gitusr use [flags]标志:
| 标志 | 简写 | 说明 |
|---|---|---|
--global |
-g |
切换全局 Git 用户(而非当前仓库) |
--name |
-n |
按姓名切换 |
--email |
-e |
按邮箱切换 |
--index |
-i |
按索引切换(通过 gitusr list 查看索引) |
示例:
# 在当前仓库切换(交互式选择)
gitusr use
# 按索引切换
gitusr use --index 1
# 按邮箱切换
gitusr use --email north@example.com
# 全局切换
gitusr use --global --name "North Wang"显示当前仓库级别或全局的 Git 用户配置。
别名: ct
用法:
gitusr current [flags]标志:
| 标志 | 简写 | 说明 |
|---|---|---|
--global |
-g |
显示全局 Git 用户 |
示例:
# 查看当前仓库用户
gitusr current
# 查看全局用户
gitusr current --global列出所有已保存的 Git 用户身份,每行显示索引、姓名和邮箱。
别名: ls
用法:
gitusr list示例:
gitusr list
# 0:姓名:North Wang | 邮箱:north@personal.com
# 1:姓名:Zhang San | 邮箱:zhangsan@company.com删除一个已保存的 Git 用户身份。支持通过索引、姓名或邮箱定位。
别名: rm
用法:
gitusr remove [flags]标志:
| 标志 | 简写 | 说明 |
|---|---|---|
--name |
-n |
按姓名删除 |
--email |
-e |
按邮箱删除 |
--index |
-i |
按索引删除 |
示例:
# 按索引删除
gitusr remove --index 1
# 按邮箱删除
gitusr remove --email zhangsan@company.com使用 git-filter-repo 重写历史提交记录,将匹配指定邮箱的提交作者替换为另一个已保存用户。操作前会自动创建备份分支。
前提条件: 已安装 git-filter-repo(pip install git-filter-repo)
用法:
gitusr replace <target-email> [flags]参数:
| 参数 | 说明 |
|---|---|
target-email |
需要被替换的旧作者邮箱 |
标志:
| 标志 | 简写 | 说明 |
|---|---|---|
--with-name |
指定新用户的姓名 | |
--with-email |
指定新用户的邮箱 | |
--with-index |
指定新用户的索引 | |
--yes |
-y |
历史重写后自动切换仓库用户,跳过确认 |
示例:
# 将所有提交中 old@wrong.com 的作者替换为索引 1 的用户
gitusr replace old@wrong.com --with-index 1
# 替换完成后自动切换仓库用户(跳过确认)
gitusr replace old@wrong.com --with-name "North Wang" --with-email "north@example.com" --yes安装 Shell 钩子后,gitusr 可以在 git clone、git commit、cd 等操作中自动检测并切换 Git 用户身份。
用法:
gitusr hooks <subcommand> [flags]子命令:
| 子命令 | 说明 |
|---|---|
install |
安装所有 shell 钩子(bash + zsh) |
uninstall |
卸载所有 shell 钩子 |
enable |
启用指定类型的钩子 |
disable |
禁用指定类型的钩子 |
为当前 Shell(bash 和 zsh)安装所有自动切换钩子。操作是幂等的 —— 如果所有钩子都已安装,会提示已安装并退出。
安装后支持三种钩子类型:
clone—git clone结束后自动进入仓库目录,并按以下优先级应用用户:显式--gu-name/--gu-email参数 > 仓库内.gitusrrc>hosts规则(按仓库 URL 的 host 匹配)> 交互式gitusr use。显式参数可在非 TTY 环境下指定用户commit—git commit时自动读取.gitusrrc并应用用户cd—cd到包含.gitusrrc的目录时自动应用用户
示例:
# 安装所有钩子(bash + zsh)
gitusr hooks install卸载所有已安装的 shell 钩子。
示例:
# 卸载所有钩子
gitusr hooks uninstall启用指定类型的钩子(恢复之前被禁用的钩子)。
用法:
gitusr hooks enable <clone|commit|cd>示例:
# 启用 clone 钩子
gitusr hooks enable clone
# 启用 commit 钩子
gitusr hooks enable commit
# 启用 cd 钩子
gitusr hooks enable cd禁用指定类型的钩子,使其不再触发,但保留安装状态。
用法:
gitusr hooks disable <clone|commit|cd>示例:
# 禁用 clone 钩子
gitusr hooks disable clone
# 禁用 commit 钩子
gitusr hooks disable commit
# 禁用 cd 钩子
gitusr hooks disable cd在 Git 仓库根目录创建 .gitusrrc 文件,当 cd 进入该目录或 git commit 时,hook 会自动匹配并应用对应的 Git 用户。
格式:
{
"name": "Zhang San",
"email": "zhangsan@company.com"
}匹配优先级:email > name。只要提供其中一项即可。
当 git clone 一个仓库时,clone 钩子会读取仓库 URL 的 host,并按配置的路由规则自动应用对应的 Git 用户。适合"github.com 用个人账号、code.byted.org 用公司账号"这类场景。
用法:
gitusr hosts <subcommand> [flags]子命令:
| 子命令 | 说明 |
|---|---|
set <host> <email> |
新增或就地更新一条规则;email 必须是已保存的用户 |
list |
带序号列出所有规则(序号供 move 引用) |
remove <host> |
删除指定规则 |
move <host> <target> |
调整规则顺序;target 为序号、first、last、up 或 down |
匹配规则:
- host 统一小写、忽略端口;支持
https://、ssh://、git://及git@host:path等 URL 形态 github.com精确匹配该 host;*.byted.org匹配任意深度子域- 同一 host 命中多条规则时:精确匹配 > 通配匹配,同级别按配置顺序先配置者胜
示例:
# github.com 用个人账号
gitusr hosts set github.com wyb_goodluck@163.com
# code.byted.org 及其所有子域用公司账号
gitusr hosts set *.byted.org wangyubo.1219@bytedance.com
# 查看与调整顺序
gitusr hosts list
gitusr hosts move code.byted.org first
# 删除
gitusr hosts remove github.com异常行为:
- clone 后若仓库自带
.gitusrrc,以.gitusrrc为准(优先于 host 规则) - 规则引用的用户已被删除时,输出一行警告并跳过,不影响 clone
- 配置了 hosts 规则但当前 URL 不匹配时静默跳过,不再弹出交互式选择
brew uninstall gitusr卸载后,用户数据文件不会自动删除,如需清理可手动执行:
rm -rf "${XDG_DATA_HOME:-$HOME/.local/share}/gitusr"