Cara Pisahkan Git Identity Work dan Personal di Satu Laptop #
Remote work udah ngilangin batasan antara mesin kantor dan mesin rumah. Satu laptop, dua akun GitHub, nol ruang untuk error — sampai suatu hari kamu push project weekend dan avatar kerja kamu muncul di commit. Kalau pernah panik amend commit setelah sadar git config --global user.email menunjuk ke you@company.com terus-terusan, guide ini buat kamu.
Solusinya bukan mengingat flag override di setiap git commit. Solusinya adalah bikin Git pilih identity yang tepat otomatis berdasarkan folder mana kamu berada. Inilah setup lengkapnya: SSH keys, SSH config, dan direktif Git includeIf.
Kenapa Global Config Saja Jebakan #
Git baca konfigurasi dalam urutan: system → global → local. Nilai di ~/.gitconfig (global) menang atas /etc/gitconfig (system), tapi nilai apapun di .git/config repo (local) override semuanya. Kebanyakan developer set satu nama dan email global, terus lupa — sampai punya dua akun.
| Scope | File | Kapan berlaku |
|---|---|---|
| System | /etc/gitconfig |
Setiap user di mesin |
| Global | ~/.gitconfig |
Kamu, di mana pun |
| Local | <repo>/.git/config |
Satu repository saja |
Masalahnya: global terlalu luas dan local terlalu sempit. Kamu butuh sesuatu di tengah — aturan yang bilang “semua di ~/work/ adalah kamu-di-kerja, semua di ~/personal/ adalah kamu-di-rumah.” Itulah yang includeIf sediakan.
Konvensi Folder #
Pilih dua direktori root dan tempel ke situ:
~/work/ -> semua repository perusahaan
~/personal/ -> semua repository personal / open-sourceSetiap repo yang kamu clone masuk ke salah satu. Sisa guide ini asumsi pake pembagian ini.
Step 1 — Buat SSH Keys untuk Setiap Akun #
Bikin satu ED25519 key per identity GitHub/GitLab:
# Key kerja
ssh-keygen -t ed25519 -C "you@company.com" -f ~/.ssh/id_ed25519_work
# Key personal
ssh-keygen -t ed25519 -C "you@personal.com" -f ~/.ssh/id_ed25519_personalTambahkan kedua public keys ke akun GitHub/GitLab masing-masing di Settings → SSH and GPG keys. Kalau sebelumnya pake Personal Access Token (PAT), pindah ke SSH — jadi gak perlu repot token expire.
Load Keys ke SSH Agent #
ssh-add ~/.ssh/id_ed25519_work
ssh-add ~/.ssh/id_ed25519_personal
# Verifikasi keduanya ter-load
ssh-add -lHarusnya kelihat dua ED25519 entry, satu per identity file.
Step 2 — Konfigurasi SSH Host Aliases #
Edit ~/.ssh/config biar Git tahu key mana buat remote mana:
# ~/.ssh/config
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
Host github-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personalKalau kamu juga pake GitLab di kerja, tambah blok serupa dengan HostName gitlab.com.
Clone Pake Alias #
Alih-alih hostname asli, pake alias:
# Repo kerja
git clone git@github-work:company/project-api.git
# Repo personal
git clone git@github-personal:yourname/side-project.gitSSH alias route setiap koneksi lewat key yang tepat — gak perlu tebak, gak perlu flag -i setiap kali.
Step 3 — Setup includeIf di .gitconfig #
Ini potongan yang ilang wrong-identity problem. Buka ~/.gitconfig dan tambahin includeIf directives:
# ~/.gitconfig
[includeIf "gitdir:~/work/"]
path = ~/.gitconfig-work
[includeIf "gitdir:~/personal/"]
path = ~/.gitconfig-personalSekarang bikin setiap identity file:
# ~/.gitconfig-work
[user]
name = Your Name
email = you@company.com# ~/.gitconfig-personal
[user]
name = Your Name
email = you@personal.comCara kerjanya: kapan pun Git jalan di repo yang path-nya cocok gitdir:~/work/**, dia baca ~/.gitconfig-work di atas global config, override user.name dan user.email. Logic yang sama berlaku buat ~/personal/.
Tips: Kamu juga bisa set config repo-specific di local file, tapi
includeIfnghemat kamu dari ngulanggit config user.emaildi setiap clone baru.
Step 4 — Verifikasi Sebelum Commit #
Jangan percaya — verifikasi. Di dalam repository apapun:
# Cek cepat
git config user.email
git config user.name
# Dump penuh local config
git config --list --localKalau email gak cocok dengan akun yang kamu maksud, berhenti — kamu mungkin di folder salah atau pattern includeIf gak match. Pindahkan repo atau fix pattern sebelum commit.
Quick Sanity Script #
Lempar one-liner ini ke shell prompt atau pre-commit hook kalau mau double-check:
git config user.email | grep -q "company.com" && echo "🔒 Work identity" || echo "🏠 Personal identity"Common Pitfalls #
| Masalah | Solusi |
|---|---|
| Commits masih tampil email salah | Verifikasi path repo cocok pattern gitdir: (trailing slash penting) |
| SSH prompt passphrase setiap push | Jalankan ssh-add (atau pakai ~/.ssh/config dengan AddKeysToAgent yes) |
includeIf diabaikan di Git lama |
Butuh Git >= 2.13; upgrade dengan git --version |
| Sudah clone pake URL default | Ubah remote: git remote set-url origin git@github-work:company/repo.git |
FAQ #
Bisa punya lebih dari dua profiles? #
Bisa. Tambah lebih banyak includeIf entries — satu per direktori (misal ~/oss/ buat open-source contributions dengan email terpisah). Setiap dapat file ~/.gitconfig-<label> sendiri.
Kalau lupa clone pake SSH alias? #
URL default git@github.com: pakai default SSH key kamu, yang mungkin salah. Selalu clone pake alias (github-work / github-personal), atau — kalau udah clone — fix remote pake git remote set-url.
Apakah includeIf work dengan GIT_DIR atau worktrees? #
includeIf "gitdir:" match terhadap working-directory path, jadi worktrees dan setup GIT_DIR mungkin berlaku beda. Test pake git config user.email setelah setup.
Perlu separate GPG signing keys per profile? #
Gak wajib, tapi recommended kalau perusahaan enforce commit signing. Bikin GPG key per identity, tambahkan ke file gitconfig-<label> yang sesuai di bawah [user] signingkey, dan set [commit] gpgSign = true.
Ini work di Windows? #
Iya, dengan minor path adjustments. Pakai gitdir:C:/Users/you/work/ (forward slashes) di includeIf. SSH config dan key generation identik di Git Bash atau WSL.
Summary #
| Komponen | Fungsi |
|---|---|
| Dua SSH keys | Buktikan identitas kamu ke dua akun GitHub/GitLab berbeda |
~/.ssh/config Host aliases |
Route setiap koneksi ke key yang tepat |
includeIf di ~/.gitconfig |
Set name/email per direktori otomatis |
Konvensi folder (~/work/, ~/personal/) |
Kasih pattern buat includeIf match |
Setup sekali, Git pilih identity yang tepat untuk setiap commit — gak ada overhead mental, gak ada lagi amend penuh rasa bersalah.