Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save bgauduch/06a8c4ec2fec8fef6354afe94358c89e to your computer and use it in GitHub Desktop.
Save bgauduch/06a8c4ec2fec8fef6354afe94358c89e to your computer and use it in GitHub Desktop.
Git config with multiple identities and multiple repositories

Setup multiple git identities & git user informations

/!\ Be very carrefull in your setup : any misconfiguration make all the git config to fail silently ! Go trought this guide step by step and it should be fine 😉

Setup multiple git ssh identities for git

  • Generate your SSH keys as per your git provider documentation.

  • Add each public SSH keys to your git providers acounts.

  • In your ~/.ssh/config, set each ssh key for each repository as in this exemple:

      Host github.com
      	HostName github.com
      	User git
      	IdentityFile ~/.ssh/github_private_key
      	IdentitiesOnly=yes
      Host gitlab.com
      	Hostname gitlab.com
      	User git
      	IdentityFile ~/.ssh/gitlab_private_key
      	IdentitiesOnly=yes

Setup dynamic git user email & name depending on folder

/!\ Require git 2.13+ for conditional include support.

The idea here is to use a different git user name & email depending on the folder you are in.

  • In your ~/.gitconfig, remove the [user] block and add the following (adapt this exemple to your needs) :

      [includeIf "gitdir:~/code/personal/"]
      	path = .gitconfig-personal
      [includeIf "gitdir:~/code/professional/"]
      	path = .gitconfig-professional
  • In your ~/.gitconfig-personal, add your personnal user informations:

      [user]
      	email = user.personal@users.noreply.github.com     # note we use the noreply github mail
      	name = personal_username
  • In your ~/.gitconfig-professional, add your professional user informations:

      [user]
      	email = user.professional@dns.com
      	name = professional_username

Setup a GPG key

If you need to add a GPG key and bind it to a user to sign your commits, you can do so like this:

You should have GPG installed and configured like the GPG suite

  • Add the GPG key ID to your ~/.gitconfig-<PROFILE> config and enable commit signing:

    [user]
      email = your.mail@domain.com
      name = Your NAME
      signingkey = SIGNING_KEY_ID
    [commit]
      gpgsign = true
  • Make sure to register the right GPG binary in your ~/.gitconfig:

    [program]
      pgp = /path/to/your/gpg2/bin

Test your setup

  • Now each repository will use the custom user info setup depending on the top-level folder.

  • Check your settings are taken into account, for instance in ~/code/personal/ :

    $ cd ~/code/personal/
    $ git config --get user.email    	# should return user.personal@users.noreply.github.com as per the exemple
    $ git config --get user.name     	# should return personal_username as per the exemple
    $ git config --get user.signingkey	# should return the GPG key ID as configured for the user
  • Do the same for each folder you have setup.

  • You can also display and check the global git config: git config --list --global

    • Or just the local config for the repository folder you are in: git config --list
  • Done !

Roadmap

  • use git config commands instead of config file manual editions (editing config directly is kind of dangerous but is more understandable, maybe keep it like this ?)
@825i
Copy link

825i commented Nov 22, 2023

For your information you must now specify the .git folder in the gitdir such as :

[includeIf "gitdir:~/code/personal/repo1/.git"]

Another useful tip, you can use globbing on parent directory to detect new repos without editing your git-config file :

[includeIf "gitdir:~/code/personal/**/.git"]

Thanks! I will pulling my hair out wondering why it didn't work. Also thanks for the globbing advice because that would have been my next question!

@MGREMY
Copy link

MGREMY commented Apr 24, 2024

Thanks man ! Note that git config --get xxxx.xxxx works only when you are inside a repository, otherwise it doesn't show anything 👍

@offwork
Copy link

offwork commented Apr 25, 2024

Hi there!

Simple solution for Mac and fish-shell users like me:
After the ssh keys are created, run the agent command for fish:

eval $(ssh-agent -c)

and then install the ssh keys on the mac keychain:
ssh-add --apple-load-keychain -A ~/.ssh/github_personal
ssh-add --apple-load-keychain -A ~/.ssh/bitbucket_work

and then install the ssh keys on the mac keychain.

Screenshot 2024-04-25 at 15 42 29

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment