summaryrefslogtreecommitdiff
path: root/content/posts/make-git-work-with-multiple-accounts.md
diff options
context:
space:
mode:
authorclaw0ry <me@claw0ry.net>2024-12-11 13:56:52 +0100
committerclaw0ry <me@claw0ry.net>2024-12-11 13:56:52 +0100
commit4719cc03837490ed4bf1b9725d75a686e56e5a6a (patch)
tree769dd3a3a87153df049b3043196bd131495b10ad /content/posts/make-git-work-with-multiple-accounts.md
fresh start
Diffstat (limited to 'content/posts/make-git-work-with-multiple-accounts.md')
-rw-r--r--content/posts/make-git-work-with-multiple-accounts.md116
1 files changed, 116 insertions, 0 deletions
diff --git a/content/posts/make-git-work-with-multiple-accounts.md b/content/posts/make-git-work-with-multiple-accounts.md
new file mode 100644
index 0000000..50ad924
--- /dev/null
+++ b/content/posts/make-git-work-with-multiple-accounts.md
@@ -0,0 +1,116 @@
+---
+title: 'Make git work with multiple accounts'
+date: 2022-08-11T13:38:35+02:00
+draft: false
+---
+
+In this article we're going to look at how you can setup git to work with multiple Github accounts and SSH.
+
+<!--more-->
+
+### Generate SSH keys
+
+Github only allows you to use the same SSH key for one account, therefor if you have multiple accounts (e.g personal and work) you must generate two different SSH key pairs.
+
+```bash
+ssh-keygen -f ~/.ssh/gh_personal -t rsa -b 4096
+ssh-keygen -f ~/.ssh/gh_work -t rsa -b 4096
+```
+
+### Folderstructure
+
+My personal preference is to use dedicated folder pr Github account. So my folderstructure looks something like this:
+
+```
+~/code
+└── github.com
+ ├── personal
+ └── work
+```
+
+Based on this, we can put a `.gitconfig` in each of folders, so it becomes this:
+
+```
+~/code
+└── github.com
+ ├── personal
+ │   └── .gitconfig
+ └── work
+ └── .gitconfig
+```
+
+We're going to edit these files soon to add account specific configurations.
+
+### Conditional configuration includes
+
+git version 2.13 and newer supports [conditional includes](https://git-scm.com/docs/git-config#_includes), which means that we can include different `.gitconfigs` based on a condition.
+
+We're going to use the `gitdir` keyword to include a specific `.gitconfig` based on where our git project is located.
+
+In our main `.gitconfig` (usually under `~/.gitconfig`) we need to add these conditionals at the top.
+
+```
+[includeIf "gitdir:~/code/github.com/personal/"]
+ path = ~/code/github.com/personal/.gitconfig
+[includeIf "gitdir:~/code/github.com/work/"]
+ path = ~/code/github.com/work/.gitconfig
+
+...
+```
+
+**NOTE:** The trailing slash of folder path is neccessary or else it wont work
+
+### Tell git which ssh-key to use
+
+Now that we have set our conditionals we can edit each of the `.gitconfig` files to tell git which ssh-key to use, and set other account specific configs like name and email.
+
+**~/code/github.com/personal/.gitconfig**
+
+```
+[user]
+ name = "John Doe"
+ email = "johndoe@example.com"
+[core]
+ sshCommand = "ssh -i ~/.ssh/gh_personal
+```
+
+**~/code/github.com/work/.gitconfig**
+
+```
+[user]
+ name = "John Doe"
+ email = "johndoe@company.com"
+[core]
+ sshCommand = "ssh -i ~/.ssh/gh_work
+```
+
+Now whenever you interact with git in a project that is located under `~/code/github.com/work` it will use the `.gitconfig` for work and associated ssh key, and vice-versa for your personal projects.
+
+### Additional providers
+
+This setup is not specific to Github, so if you for example also have a Bitbucket (or any other git provider that supports ssh) account which uses a different SSH key you would use the same technique.
+
+```
+ssh-keygen -f ~/.ssh/bitbucket -t rsa -b 4096
+```
+
+```
+# file: ~/.gitconfig
+
+...
+
+[includeIf "gitdir:~/code/bitbucket/"]
+ path = ~/code/bitbucket/.gitconfig
+
+...
+```
+
+```
+# file: ~/code/bitbucket/.gitconfig
+
+[user]
+ name = "John Doe"
+ email = "johndoe@company.com"
+[core]
+ sshCommand = "ssh -i ~/.ssh/bitbucket"
+```