Marc Liyanage Marc Liyanage - 13 days ago 5
Git Question

Can I configure git so it does not guess user.email configuration settings?

On my system I don't have the

user.email
git configuration value set at the global level, on purpose. Instead, I configure it individually in each sandbox. This is because I need to use different e-mail addresses for different projects.

Unfortunately I sometimes forget to configure the value when I create a new sandbox. In those cases, git just "guesses" a value based on information it gets from the environment. That leads to various problems, for example commits are not attributed to me on github, and I won't have much luck getting those commits with
@localhost
e-mail addresses attributed to me retroactively.

Is there a way to configure git to error out instead of guessing when I try to commit without a local or global
user.email
value configured?

Answer

Use a pre-commit hook

You can use a pre-commit hook to prompt you to setup your project-specfic email address. For example:

#!/bin/sh

email=`git config user.email`

if ["$email" = ''] 
then
    echo "you need to set your email for this project"
    exit 1
fi

This will cause committing without the appropriate config to fail:

$ git commit -va
you need to set your email for this project
$

Use git's template to make sure it's always present

You can use git templates to make sure the hook is present in future repositories by default, by placing the hook in the templates folder:

-> tree /usr/share/git-core/templates/
/usr/share/git-core/templates/
├── branches
├── description
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-rebase.sample
│   └── update.sample
└── info
    └── exclude

The exact location of the templates folder may vary with OS/distribution.

For existing repositories - either create/copy the hook into place or if the git-core templates folder has been updated run git init to create the new hook file.

Comments