DevLog

Sử dụng nhiều tài khoản Git trên cùng một máy

Cách mình cấu hình SSH và Git config để làm việc với nhiều tài khoản GitHub mà không phải chuyển tay giữa các key và email.

Trạm Dev
25 tháng 10, 2025
DevOps
#SSH#Git
Sử dụng nhiều tài khoản Git trên cùng một máy

Bối cảnh

Mình đang sử dụng khá nhiều tài khoản git, cả github và gitlab. Cá nhân mình cũng có nhiều profile, và cũng có profile riêng cho công việc ở công ty. Trong quá trình làm việc có một số rắc rối như sau:

  • Mỗi lần chuyển repo là phải remove ssh key để add lại cho đúng
  • Với các project mới cần phải thiết lập lại user.name và user.email cho đúng với tài khoản

Mình muốn mọi thứ tự động: repo nào thì dùng đúng key và đúng tên/email tương ứng, không cần nhớ hay đổi tay nữa.

Giải pháp

1. Sử dụng SSH config: host match

SSH hỗ trợ config ssh key theo từng host, nếu chỉ có 2 tài khoản ở hai host khác nhau thì chỉ cần thiết lập host là đáp ứng được yêu cầu:

Match Host github.com
  IdentityFile ~/.ssh/id_rsa_github
  IdentitiesOnly yes

Match Host gitlab.com
  IdentityFile ~/.ssh/id_rsa_gitlab
  IdentitiesOnly yes

2. Sử dụng SSH config: host alias

Trong trường hợp có nhiều tài khoản của cùng một host thì phương án trên không khả thi, mình cần sử dụng phương án mới: host alias.

# Tài khoản cá nhân
Host github-personal
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_personal
  IdentitiesOnly yes

# Tài khoản công ty
Host github-work
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_work
  IdentitiesOnly yes

Sau đó mình sẽ clone git về với alias host github-personal, github-work thay vì github.com

# Repo công ty
git clone git@github-work:company/project.git

# Repo cá nhân
git clone git@github-personal:me/my-repo.git

SSH sau đó sẽ động lựa chọn ssh key dựa trên host mình đã đặt.

3. Sử dụng SSH config: custom match

Với phương án trên vấn đề được giải quyết ổn thoả, tuy nhiên đần dần mình cảm thấy phiền với việc phải đổi host cho remote url. Mình chuyển qua sử dụng phương án mới:

Match Exec "[[ $(git config --get remote.origin.url) =~ .*[email protected]:my-username.* ]]"
  IdentityFile ~/.ssh/hailerity_rsa
  IdentitiesOnly yes

Trên đây sử dụng Match Exec để thực hiện câu lệnh check xem git remote url khớp với một tài khoản không, nếu khớp sẽ dùng ssh key tương ứng, không khớp sẽ bỏ qua.

Cách này rất linh hoạt, và không cần phải đổi remote url host. Tuy nhiên có một hạn chế với phương án này là không thể áp dụng cho câu lệnh git clone. Mặc dù đã rất cố gắng nhưng mình vẫn chưa có phương án hỗ trợ cho cả git clone.

4. Sử dụng Git config để tự chọn user/email

Sau nhiều lần commit project dùng sai user.name và user.email, mình tìm cách thiết lập để tránh sai lầm đó.

Git có hỗ trợ set config file theo điều kiện trong ~/.gitconfig:

[user]
  name = Tram Dev
  email = [email protected]

[includeIf "gitdir:~/Workspaces/personal/**"]
  path = ~/Workspaces/personal/.gitconfig

[includeIf "gitdir:~/Workspaces/work/**"]
  path = ~/Workspaces/work/.gitconfig

Với config trên, các project ở trong ~/Workspaces/personal sẽ sử dụng file gitconfig ở trong thư mục đó, tương tự với ~/Workspaces/work. Như vậy mình chỉ cần viết .gitconfig cho từng thư mục và đặt project vào đúng thư mục là được.