In my ~/.gitconfig
, I list my personal email address under [user]
, since that's what I want to use for Github repos.
But, I've recently started using git for work, too. My company's git repo allows me to commit, but when it sends out announcements of new changesets, it says they are from Anonymous because it doesn't recognize the email address in my .gitconfig
- at least, that's my theory.
Is it possible to specify multiple [user]
definitions in .gitconfig
? Or is there some other way to override the default .gitconfig
for a certain directory? In my case, I check out all work code in ~/worksrc/
- is there a way to specify a .gitconfig
for only that directory (and its subdirectories)?
After getting some inspiration from Orr Sella's blog post I wrote a pre-commit hook (resides in
~/.git/templates/hooks
) which would set specific usernames and e-mail addresses based on the information inside a local repositorie's./.git/config
:You have to place the path to the template directory into your
~/.gitconfig
:Then each
git init
orgit clone
will pick up that hook and will apply the user data during the nextgit commit
. If you want to apply the hook to already exisiting repos then just run agit init
inside the repo in order to reinitialize it.Here is the hook I came up with (it still needs some polishing - suggestions are welcome). Save it either as
or
and make sure it is executable:
chmod +x ./post-checkout || chmod +x ./pre_commit
EDIT:
So I rewrote the hook as a hook and command in Python. Additionally it's possible to call the script as a Git command (
git passport
), too. Also it's possible to define an arbitrary number of IDs inside a configfile (~/.gitpassport
) which are selectable on a prompt. You can find the project at github.com: git-passport - A Git command and hook written in Python to manage multiple Git accounts / user identities.I made a bash function that handle that. Here is the Github repo.
For record:
May be it is simple hack, but it is useful. Just generate 2 ssh keys like below.
Same way create one more for personal. So, you have 2 ssh keys, work and company. Copy work.pub, work, personal.pub, personal to ~/.ssh/ Directory.
Then create shell script with the following lines and name it as crev.sh (Company Reverse) with following content.
Same way, create one more called prev.sh (Personal Reverse) with the following content.
in ~/.bashrc add aliases for those scripts like below
When ever you wanna use company, just do crev, and if you wanna use personal do prev :-p.
Add those ssh keys to your github accounts. Make sure, you don't have id_rsa generated perviously, because those scripts will overwrite id_rsa. If you have already generated id_rsa, use that for one of the account. Copy them as personal and skip generation of personal keys.
With conditional includes in Git 2.13, it is now possible to have multiple user/email coexist on one machine with little work.
user.gitconfig
has my personal name and email.work-user.gitconfig
has my work name and email. Both files are at~
path.So my personal name/email applies by default. For
c:/work/
dir, my work name/email is applied. Forc:/work/github/
dir, my personal name/email is applied. This works as the last setting gets applied.gitdir
is case-sensitive andgitdir/i
is case-insensitive."gitdir/i:github/"
would apply the conditional include for any directory withgithub
in its path.One command github accounts switch
This solution takes the form of a single git alias. Once executed, the current project user will be attached to another account
Generate ssh keys
Link them to your GitHub / Bitbucket accounts
pbcopy < ~/.ssh/id_rsa.pub
add SSH key
github pagepbcopy < ~/.ssh/id_rsa_pro.pub
Step 1. Automatic ssh key switching.
We can configure
ssh
to send a use a specific encryption key depending on thehost
. The nice thing is that you can have several aliases for the samehostname
.See this example
~/.ssh/config
file:git remote configuration
You can now use these aliases in the git remotes by changing
git@github.com
bygit@github_pro
.You can either change your existing projects remotes (using something like
git remote origin set-url git@github_pro:foo/bar.git
) or adapt them directly when cloning them.using alias, it become:
git clone git@github_pro:ArnaudRinquin/atom-zentabs.git
Step 2. Changing git user.email
Git config settings can be global or per project. In our case, we want a per project settings. It is very easy to change it:
While this is easy, it takes way to long for the developers we are. We can write a very simple git alias for that.
We are going to add it to the
~/.gitconfig
file.Then, all we have to do is
git setpromail
to have our email changed for this project only.Step 3. One command switch please?!
Wouldn’t it be nice to switch from default account to a specified one with a single parameter-less command? This is definitely possible. This command will have two steps:
We already have a one command solution for the second step, but the first one is way harder. One command remote host change
Here comes the solution in the form of another git alias command to add to your
~/.gitconfig
:This allows changing all remotes from one host to another (the alias). See the example:
Combine them all
We now just have to combine the two commands into one, this is quite easy. See how I also integrate bitbucket host switching.
Source Link -Tutorial
Something like Rob W's answer, but allowing different a different ssh key, and works with older git versions (which don't have e.g. a core.sshCommand config).
I created the file
~/bin/git_poweruser
, with executable permission, and in the PATH:Whenever I want to commit or push something as "Power User", I use
git_poweruser
instead ofgit
. It should work on any directory, and does not require changes in.gitconfig
or.ssh/config
, at least not in mine.