Can gitconfig options be set conditionally?
No, Git config does not support checks or conditional statements. But your underlying shell probably does, so you can use something like:
[core] editor = "if [[ $IS_REMOTE -eq 1 ]]; then ED='vim'; else ED='subl -n -w'; fi; $ED"
If you need to do something more complicated than that, you could just throw the shell code into a script, of course, like
[core] editor = "my_edi_script.sh"
with my_edit_script.sh
containing something like:
#!/bin/bashif [[ $IS_REMOTE -eq 1 ]]; then ED="vim"else ED="subl -n -w"fi$ED some argument or other
Edit: The my_edit_script.sh
would have to be in the $PATH, of course :)
The [include]
section learned by git-config in v1.7.9 gets you most of the way there.
While it doesn't let you write runtime conditionals, it does give you a framework for refactoring your ~/.gitconfig
into several parts: the shared section, and the env-specific sections. After that, you can symlink something like ~/.gitconfig.local
to the relevant env-specific config file, and include ~/.gitconfig.local
from ~/.gitconfig
.
The symlinking part can be scripted and done automatically as part of your dotfiles' init script.
From the command line, that include path can be added via:
git config --global include.path '~/.gitconfig.local'
I use the quotes above specifically to prevent the shell from expanding ~
to an absolute path.
That adds the following section to your ~/.gitconfig
:
[include] path = ~/.gitconfig.local
Here's a snippet from the git-scm book showing the general format:
[include] path = /path/to/foo.inc ; include by absolute path path = foo ; expand "foo" relative to the current file path = ~/foo ; expand "foo" in your $HOME directory
You can conditionally include another Git config file based on your Git directory or branch in Git 2.13 and later.
Put your default configuration in file ~/.gitconfig
as usual. At the end, conditionally include another configuration file:
[user] email = john@personal.com name = John McGehee# All work Git repositories are in a subdirectory of ~/work.# All other Git repositories are outside ~/work.[includeIf "gitdir:~/work/"] path = .gitconfig.work
Then, in ~/.gitconfig.work
add or override configuration values you want when using a repository located in ~/work
or any subdirectory thereof:
[user] email = john@work.com
You can observe the difference by changing to a Git directory under ~/work
, and running:
git config user.email
Try the same command in a Git directory that is not under ~/work
.