--- title: "Git — Per-Remote Identity with includeIf" aliases: [git-includeif, git-multiple-identities, git-work-personal-email, git-conditional-config] tags: [git, dotfiles, identity, ssh, bitbucket, github] sources: - "daily/2026-04-23.md" created: 2026-04-23 updated: 2026-04-23 --- # Git — Per-Remote Identity with includeIf Git's `includeIf` directive in `.gitconfig` applies a supplemental config file only when a condition matches. The `hasconfig:remote.*.url` variant matches on the remote URL of the current repository, making it possible to automatically switch git identities (email, signing key, etc.) based on whether a repo is hosted on GitHub vs Bitbucket or any other remote — without any per-repo manual config. ## Key Points - **`includeIf "hasconfig:remote.*.url:*github.com*"`** matches any repo with a GitHub remote — applies a separate `.gitconfig-github` file automatically - Eliminates the need to run `git config user.email` in every new personal repo — the correct identity is applied by remote URL - The condition uses glob-style wildcards: `*github.com*` matches both `https://github.com/...` and `git@github.com:...` - More robust than `includeIf "gitdir:~/projects/personal/"` (directory-based) — works regardless of where the repo is cloned - Order matters: the included file is applied after the main config, so it overrides values in `.gitconfig` ## Details ### The Problem This Solves Working with multiple git identities (work email for Bitbucket/Oliver repos, personal email for GitHub) previously required remembering to run `git config user.email` in each new personal repo. Forgetting resulted in commits to GitHub attributed to the work email. Remote-based `includeIf` makes this automatic and invisible. ### `.gitconfig` Setup ```ini # ~/.gitconfig — main config (default = work identity) [user] name = Vadym Samoilenko email = vadymsamoilenko@oliver.agency # Override with personal identity for GitHub repos [includeIf "hasconfig:remote.*.url:*github.com*"] path = ~/.gitconfig-github ``` ```ini # ~/.gitconfig-github — personal identity [user] email = samoylenko.vadym@gmail.com ``` After this setup, any repo with a `github.com` remote automatically uses the personal email. Bitbucket, internal GitLab, and other remotes use the default work email. ### Verifying the Correct Identity ```bash # In a GitHub repo git config user.email # → samoylenko.vadym@gmail.com # In a Bitbucket/work repo git config user.email # → vadymsamoilenko@oliver.agency ``` ### SSH Key Separation (Complementary) `includeIf` handles commit identity (who authored the commit). SSH key selection (which credential is used to authenticate the push) is handled separately in `~/.ssh/config`: ```ssh # ~/.ssh/config Host github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519_github Host bitbucket.org HostName bitbucket.org User git IdentityFile ~/.ssh/id_ed25519_bitbucket ``` Both pieces are needed: `includeIf` for commit metadata, `~/.ssh/config` for authentication. ### Alternative: Directory-Based includeIf If the remote URL approach is too broad, a directory-based condition is more explicit: ```ini [includeIf "gitdir:~/personal/"] path = ~/.gitconfig-github ``` This applies the override only to repos inside `~/personal/`. The downside: repos cloned anywhere else won't get the override automatically. ### Migration: Adding includeIf to an Existing Config When migrating from a single identity to multiple identities: 1. Set the work email as the default in `~/.gitconfig` 2. Create `~/.gitconfig-github` with the personal email 3. Add the `includeIf` block to `~/.gitconfig` 4. Verify in an existing GitHub repo: `git config user.email` Past commits already made with the wrong email are not affected — `includeIf` only applies to future commits. ## Related Concepts - [[wiki/concepts/fish-shell-path-config]] — SSH aliases as Fish functions complement this SSH config approach - [[wiki/concepts/remote-server-dotfiles-bootstrap]] — dotfiles migration context where this pattern was configured - [[wiki/concepts/bitbucket-mcp-atlassian]] — Bitbucket identity context (one of the two remotes managed by this config) ## Sources - [[daily/2026-04-23.md]] — New workstation SSH/git migration session: git identity split required between `vadymsamoilenko@oliver.agency` (Bitbucket/work) and `samoylenko.vadym@gmail.com` (GitHub); `includeIf "hasconfig:remote.*.url:*github.com*"` selected as the mechanism