Carrying your Git settings around

At work (and at home) I use SSH to administrate all computers - my mobile phone, my satellite TV receiver, desktop PCs, laptops and the various servers running at home or in the data centers.

The settings in /etc/ are kept in Git repositories so I can restore them easily when something breaks badly. It also allows me to check when I modified a file and why I did it. And it gives me the ability to merge settings from one machine onto the other one easily because all machines use the same repository, just a different branch.

When committing changes as root, the user name and email address are often not mine but root@hostname, which is misleading and gives very poor change logs when multiple admins commit changes.

The multiple admins issue is what prevents me from using

$ git config user.name "Christian Weiske"

Environment variables​

Apart from the global and repository configuration settings, Git reads the environment variables GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, GIT_COMMITTER_NAME and GIT_COMMITTER_EMAIL. The idea now is to set them on your machine and take them via SSH on every single machine.

Local setup​

At first you need to set the variables in your .bashrc file:

export GIT_AUTHOR_NAME="Christian Weiske"
export GIT_AUTHOR_EMAIL=foo@example.org
export GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"
export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"

Now either start a new shell or reload your current bash settings:

$ source ~/.bashrc

Local ssh configuration​

Add the following line to your ~/.ssh/config file:

SendEnv LANG LC_* GIT_*

LANG and LC_* get transmitted by default, just have a look at /etc/ssh/ssh_config - we just add all the Git ones.

If you put that line at the top, before any special Host settings, it will affect all hosts.

Remote daemon setup​

At least in Ubuntu 11.10 and Debian 6, sshd only accepts the LANG and LC_* variables, as seen in /etc/ssh/sshd_config:

AcceptEnv LANG LC_*

We modify the line and allow all the Git variables:

AcceptEnv LANG LC_* GIT_*

Now a quick SSH daemon reload to get it pick up the new configuration settings and we are set:

$ /etc/init.d/ssh reload
$ exit
$ ssh root@machine
$ echo $GIT_AUTHOR_NAME
Christian Weiske

Written by Christian Weiske.

Comments? Please send an e-mail.