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 yes2. 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 yesSau đó 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.gitSSH 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 yesTrê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/.gitconfigVớ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.