+ 编程

Git 多用户配置与切换(Windows)
2022-10-04

目录:

在多项目开发的情况下,实际情况下我们可能需要一台设备上使用不同的 Git 账户进行开发,在需要的时候进行切换角色,以保证在不同项目中使用特定账户。

多用户配置

Git 支持两种操作远程仓库的协议 SSH 和 HTTPS

协议 验证和传输 配置 安全性 速度 便携性
SSH SSH
HTTPS TLS/SSL ×

SSH 是使用公钥加密和私钥解密的方式进行身份验证和数据传输,需要在本地计算机上生成 SSH 密钥对,并将公钥绑定到 Git 存储库中。使用 SSH 加密协议进行数据传输,速度较快。但这个过程需要一些额外的步骤和配置。

HTTPS 协议使用 TLS/SSL 协议进行身份验证和数据传输,安全性较 SSH 协议略低。使用 HTTPS 协议不需要任何配置,只需要使用用户名和密码进行身份验证即可。使用 TLS/SSL 加密协议进行数据传输,速度较慢。

SSH

如果你想通过 SSH 区分多用户,首先需要使用 ssh-keygen 命令在配置 SSH 的时候创建多个用户的公钥,将每个用户的域别名添加到 config 配置中就可以了。

语法

ssh-keygen -t rsa -C “your_email@example.com” -f first_name

参数 描述
-t 指定密钥类型,默认是 rsa ,可以省略
-C 设置注释文字,可以写邮箱
-f 指定密钥文件存储文件名,默认 id_rsa

在 Windows 下,SSH 密钥默认储存在 C:\Users\username\.ssh,如果在 Powershell 中操作需要手动切换到 .ssh 目录

cd ~/.ssh

当然你也可以直接使用 Git Bash,它会帮你把密钥放在 .ssh 目录下

ssh-keygen -t rsa -C “your_email@example.com” -f first_name
ssh-keygen -t rsa -C “your_email@example.com” -f second_name

SSH 密钥

密钥创建完成后,你需要进入C:\Users\username\.ssh目录下,将公钥(first_name.pub)复制下来,绑定到对应的 Git 账户中,这里以 Github 为例。

SSH 配置

SSH 配置

SSH 配置

然后打开 config 配置文件,填写用户配置

SSH config

SSH config 配置

在终端中使用时,将原本的 git@github.com 更改为特定用户的 git@first_name 既可,后面的内容保持不变

git clone git@first_name:rogerdudler/git-guide.git

HTTPS

如果你使用 HTTPS 切换用户,那么只需要手动设置 Git 的用户名和邮箱既可

git config --global user.name “用户名”
git config --global user.email “邮箱”
git config --global --list

如果是单个项目,相对的你可以使用 Git 的配置级别,在项目中使用 local 级别覆盖 global 级别的用户配置,从而不影响其他项目的配置。

首先我们需要一下 Git 的配置级别,分别是 system(系统级)、global(用户级)和 local(项目级)

配置优先级: local > global > system

配置级别 名称 描述 相关命令
local 项目级 项目级配置文件,只在当前项目有效(.git/config) git config [--local]
global 用户级 用户级配置文件,适用于特定一个用户 git config --global
system 系统级 系统级配置文件,对系统中所有用户都适用 git config --system

  • 配置级别优先级越高的配置会覆盖低级别的同属性配置,如果多用户配置不生效,也有可能是配置优先级不够,配置被覆盖。

当然你会说每次都要手动切换不是太麻烦了,确实,手动切换很难保证不会输入错误,而且这种方法实在繁琐,但是目前似乎也没有其他的解决方法:(

多用户切换

Shell切换

对于双用户切换的操作,可以编写 Windows 下的 Shell 脚本来完成,原理上是进行调用 Git Bash 实现

首先,我们创建一个 git-account-switch.sh 文件,根据实际用户修改以下文件内容

#!/bin/bash
echo "切换 Git 用户开始"
\_old_user=`git config --global user.name`
echo "当前用户:$_old_user"
if [[ "first_name" = ${_old_user} ]]
then
    git config --global user.name "first_name"
    git config --global user.email "first_name@gmail.com"
else
    git config --global user.name "second_name"
    git config --global user.email "second_name@gmail.com"
fi
_new_user=`git config --global user.name`echo "切换Git用户${\_new_user}结束"
exec /bin/bash`

然后将 git-account-switch.sh 文件使用 Git Bash 运行 git-account-switch.sh 运行示例

这种方法的缺点是只能为两个 Git 用户提供切换,要支持更多的 Git 用户,就需要编写更为复杂的脚本,难免有些大题小作。

插件切换

如果你使用 VScode,那么还可以通过 VScode 中的 Git-Identity switcher 插件实现用户切换功能,这个插件会在底部工具栏左下角出现一个小人图案的切换按钮,配置之后就能快速切换 Git 用户。 git-account-switch.sh 插件使用示例

遗憾的是还没找到 jetbrains idea 的相关插件,建议先使用 Shell 切换方式暂时代替

缓存引起的 Git 用户错误

在切换 Git 用户的情况下,你可能会遇到正确配置了 Git 用户,并且登录了正确用户的前提下,使用 Git 命令查看显示之前 Git 用户的情况。

git config user.name
git config user.email

这是因为 Git 缓存了用户配置,没有成功更新,你可以查看 Git 当前的缓存方式

git config credential.helper

然后使用对应的缓存方式来重置 Git 用户配置

git config --global credential.helper store
git config --global credential.helper wincred

git config --system --unset credential.helper
git credential-manager uninstall

如果提示没有权限,可以进入 控制面板\用户帐户\管理我的凭证>Windows 凭证>普通凭证 中找到 git:https://github.com 凭证手动删除,然后重新使用命令配置 Git 用户名和邮箱既可。

本文作者: Exisi 本文链接: 版权声明:本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。