Git 凭据管理:多账户 includeIf、Token 与 SSH 密钥配置
⚡ 效率提升 git 27

TL;DR:在一台电脑上同时给公司项目和个人项目提交代码,最怕账号、邮箱串台。这篇讲三种各有适用场景的方案——用 includeIf 按目录自动切换身份、用 Token 替代密码、以及(最推荐的)SSH 密钥 + ~/.ssh/config 多主机配置。同时覆盖 GitHub、GitLab 和自建 Gitea。所有配置可直接抄。

痛点

在公司用 work@company.com 提交,回家给自己的开源项目用 me@gmail.com 提交。一旦忘了切,公司邮箱就泄进了个人项目、或者反过来——很尴尬,也不好改。再加上 HTTPS 密码、Token、SSH 密钥混在一起,多账号场景很容易乱。

下面三种方案我按推荐度排个序,你按需取用:

  1. SSH 密钥:最稳,配一次长期省心,尤其适合自建 Gitea。
  2. 分项目配置(includeIf):按目录自动切身份,工作/个人互不干扰。
  3. Token:权限细粒度、可设有效期,丢了撤销即可。

方案一:按目录自动切身份(includeIf)

Git 的 includeIf 能根据你所在的目录自动加载不同配置——把不同身份的项目放在不同目录下,就再也不用手动切了。

目标目录结构大致是这样:

~/
├── .gitconfig                      # 全局默认配置(兜底)
├── .config/git/
│   ├── gitea-config                # Gitea 专用
│   ├── github-work-config          # GitHub 工作
│   └── github-personal-config      # GitHub 个人
└── .config/git-credentials/
    ├── gitea-credentials           # Gitea 凭据
    ├── github-work                 # 工作凭据
    └── github-personal             # 个人凭据

1. 全局配置 ~/.gitconfig——主控台,告诉 Git 在哪些目录下加载哪份「分身」配置:

# ~/.gitconfig

[user]
    name = TaoTaoYu Default
    email = default@example.com

[init]
    defaultBranch = main

# 条件配置:在 ~/workspace/gitea/ 下就用 gitea-config
[includeIf "gitdir:~/workspace/gitea/"]
    path = ~/.config/git/gitea-config

[includeIf "gitdir:~/workspace/github-work/"]
    path = ~/.config/git/github-work-config

[includeIf "gitdir:~/workspace/github-personal/"]
    path = ~/.config/git/github-personal-config

2. 项目特定配置(以 Gitea 为例) ~/.config/git/gitea-config

# ~/.config/git/gitea-config

[user]
    name = GiteaUser
    email = me@gitea-server.com

[credential]
    # 指定这个环境专用的凭据文件,不和别的混在一起
    helper = store --file=~/.config/git-credentials/gitea-credentials

3. 凭据文件 ~/.config/git-credentials/gitea-credentials,格式是 http://用户名:密码@域名

http://myusername:my_secret_token@gitea.example.com

凭据文件一定要收紧权限,只有自己能读写: chmod 600 ~/.config/git-credentials/*

方案二:用 Token 替代密码

现在 GitHub、Gitea 都推荐用 Token 取代账号密码。细粒度令牌(Fine-grained Token) 的好处是能精确限制:

  • 有效期:比如只给 30 天,过期作废。
  • 权限:只读还是可写。
  • 范围:只能访问指定仓库。

以 GitHub 为例:Settings → Developer settings → Personal access tokens → Fine-grained tokens → Generate new token,选好仓库、给够权限(比如 Contents: Read & Write)。拿到 Token 后,当成密码用在 HTTPS 连接里:

# 方式 1:直接写在 URL 里(简单粗暴)
git clone https://oauth2:YOUR_TOKEN@github.com/username/repo.git

# 方式 2:配合凭据助手,在凭据文件里写
https://username:YOUR_TOKEN@github.com

方案三:SSH 密钥(最推荐,尤其自建 Gitea)

这是我最常用的方式,配一次就长期省心。

1. 生成密钥(推荐 ed25519,又快又安全;记得换成你的邮箱):

ssh-keygen -t ed25519 -C "your.email@example.com" -f ~/.ssh/id_ed25519_gitea

一路回车即可,想更安全可以设个 Passphrase。

2. 配置 ~/.ssh/config——让 SSH 知道连哪个服务器用哪把钥匙:

# ~/.ssh/config

# GitHub 专用
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_github
    IdentitiesOnly yes

# Gitea 专用
Host gitea.myserver.com
    HostName gitea.myserver.com
    User git
    Port 2222   # 如果你的 Gitea SSH 端口不是 22,这里一定要改!
    IdentityFile ~/.ssh/id_ed25519_gitea
    IdentitiesOnly yes

IdentitiesOnly yes 很关键:它强制只用你指定的那把钥匙,避免 SSH 把本地所有密钥都试一遍(密钥多了会因尝试次数过多被服务器拒绝)。

3. 把公钥告诉服务器

cat ~/.ssh/id_ed25519_gitea.pub

复制输出,去 Gitea 网页 设置 → SSH / GPG 密钥 → 增加密钥,粘贴保存。

4. 测试连接

ssh -T git@gitea.myserver.com -p 2222

看到 Hi there, You've successfully authenticated... 就通了。

安全最佳实践

  • 权限最小化:Token 能只给 Read 就别给 Write,能只给一个仓库就别给全部。
  • 定期换钥匙:Token 设过期时间,SSH Key 也可以一年一换。
  • 文件权限~/.ssh/ 目录 700,私钥 id_ed25519 必须 600,凭据文件 .git-credentials 也要 600
  • 私钥永远不要上传到任何地方(包括误传到代码仓库里)。

故障排除

Q:配了 SSH 还是让我输密码?

  1. 检查 ~/.ssh/config 里的 IdentityFile 路径对不对。
  2. 确认公钥真的加到 Gitea/GitHub 上了。
  3. git remote -v 看看远程地址——如果是 https:// 开头,要换成 git@ 开头的 SSH 地址。

Q:多个账号搞混了?git config --show-origin --get user.name,能看出当前用户名是从哪个配置文件读出来的,一目了然。

小结

三种方案各有位置:临时/脚本场景用 Token,多身份用 includeIf 按目录隔离,长期主力用 SSH 密钥。我自己自建了 Gitea,SSH + ~/.ssh/config 多主机这套是日常主力。说到自建服务,把内网的 Git 服务暴露出来同样靠的是反向代理——可以顺带看看 用 FRP 给内网设备做 SSH 穿透;想让远程上去后的终端更顺手,还有 Oh My Zsh + Powerlevel10k 配置

Git 凭据管理:多账户 includeIf、Token 与 SSH 密钥配置
http://localhost:8090/archives/git-ping-ju-guan-li-quan-gong-lue-cong-ssh-dao-duo-zhang-hu-pei-zhi
作者
fnidore
发布于
更新于
许可