Advance Git Config and Ssh Config

home ~ Advance Git Config and Ssh Config

Card image cap

dotfiles devops
2021-03-11

Many and many times I update my dotfiles1 and rewrite part of them for keep my work config and personal config in a same repo with all the config split for usage.

So I discover that I can have multiple ssh config and gitconfig on the same machine.

Multiple SSH config files

The SSH’s config file was too long to manage so one day I need to break it for make it easy for managing. So I implement one of the feature of the ssh config2: the include command.

How is it work?

You write your normal config ssh for work or personal user. Something like this for the personal config

1
2
3
4
5
Host fundor333
	User root
	HostName fundor333.com
	IdentityFile ~/.ssh/keys/fundor333
	PreferredAuthentications publickey

After this you do all the same for yor work setting and rename all like personal_config or job_config and write an empty setting as ~/.ssh/config.

So you have something like this

  • ~/.ssh/config
  • ~/.ssh/config-dir/personal_config
  • ~/.ssh/config-dir/job_config

Where config is empty. So I linking my stuff_config in to the main config with the import like this:

1
2
Include ~/.ssh/config-dir/personal_config
Include ~/.ssh/config-dir/job_config

In this way I can have sorted in a better way all my ssh config.

Multiple config for git

In reality I don’t need two gitconfig. I need two identity with git, one with some project one with others projects. Like ssh i need to use 2 account, one for work one for personal user.

In my case my repo structure is looking like this:

  • ~/Coding
  • ~/Coding/Personal
  • ~/Coding/Job

So I need to have three git identities:

  • A generic one for the default
  • A personal git identity for my personal project
  • A “job” git identity for my job project

How to do it

You need to write the .gitconfig and one file for every identities after the default one (so in this example three file, the gitconfig, the job_config and the personal_config).

So if you follow my example you have this

  • ~/.gitconfig
  • ~/.git-identities/job
  • ~/.git-identities/personal

where you need a default user for the .gitconfig linke this

1
2
3
[user]
email = git@fundor333.com
name = Fundor333

and add the regex for the path of the directory of the projects with the path for the config like this:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[includeIf "gitdir:~/Github/**"]
path = ~/.git-identities/gitconfig-fundor333

[includeIf "gitdir:~/Coding/**"]
path = ~/.git-identities/gitconfig-fundor333

[includeIf "gitdir:~/Coding/Personale/**"]
path = ~/.git-identities/gitconfig-fundor333

[includeIf "gitdir:~/Coding/job/**"]
path = ~/.git-identities/gitconfig-job

If you put in the config define in the path the gitconfig you need you will override for the target project/s like for the gitconfig-job

1
2
3
[user]
email = job@fundor333.com
name = Fundor333's Job account

This is a example for the user config but you can override all the config for the project like alias or the rule core for the commit and style of them.


  1. Dotfiles, bot and yaml files ↩︎

  2. This examples need OpenSSH 7.3 or newer for work ↩︎

by Fundor333


See Also




comments powered by Disqus