The letter A styled as Alchemists logo. lchemists
Published September 15, 2020 Updated September 17, 2020

Git Config Include

Demonstrates configuring Git to include project specific configurations.


# Hello and welcome to the Alchemists Screencasts!
# Today, we'll look at Git Config Include usage.

# Custom configurations allow you to augment your global configuration.
# This is handy when managing different profiles across multiple projects.
# For instance, I use a different configuration for paid versus open source work.
# To understand this better, let's study the following repositories:

ls -alhT
cd examples

# Now we can inspect my global Git Hooks setting:

git config --global --get core.hooksPath

# To change this setting, we can update the global configuration directly:

git config --global --replace-all core.hooksPath /dev/null
git config --global --get core.hooksPath

# In this case, I've essentially disabled my Git Hooks by pointing to a null path.
# This isn't ideal as this change effects *all* projects.
# For now, I'll revert the change:

git config --global --replace-all core.hooksPath "~/.config/git/hooks"
git config --global --get core.hooksPath

# We could update the local configuration instead:

git config --local --replace-all core.hooksPath /dev/null
git config --local --get core.hooksPath

# Unfortunately, this is cumbersome because *each* project would need updating.
# I'll revert this change too:

git config --local --unset core.hooksPath
git config --local --get core.hooksPath

# Luckily, Git provides a way to include additional configurations.
# My favorite is `includeIf`.
# To start we'll need a shell script to print the Git Hooks of each project:

vi hooks

chmod 755 hooks
cat hooks

# This script iterates over each project in this directory.
# Then it prints the project name and Git Hook used for the repository:


# We'll use this script again shortly!
# Next, let's create a custom Git configuration:

vi ~/.config/git/profiles/tutorial

cat ~/.config/git/profiles/tutorial

# The `tutorial` syntax is the same as used for `~/.gitconfig`.
# I'm using a XDG configuration to organize my `tutorial` profile:
# ...but your custom configuration can be located anywhere.
# Now we just need to teach Git to include this configuration:

git config --global includeIf.gitdir:~/Downloads/tutorial/.path ~/.config/git/profiles/tutorial

# If it helps, here is what the new entry looks like in `~/.gitconfig`:

tail -n 2 ~/.gitconfig

# The `includeIf` entry is powerful in that it accomplishes the following:
# 1. Checks if any repository is in the `~/Downloads/tutorial` directory structure.
# 2. When the above is true, it merges the `~/.config/git/profiles/tutorial` configuration.
# OK, let's see these changes in action by running our `hooks` script:


# Voilà, our custom configuration took precedence over our global configuration!
# Much easier than editing each project's configuration directly.
# To restore the global configuration, we can remove the include and profile:

git config --global --remove-section includeIf.gitdir:~/Downloads/tutorial/
rm -f ~/.config/git/profiles/tutorial

# Once again, our global configuration is restored:


# You can use this feature to customize more than just Git Hooks.
# Anything in your global Git configuration will work for these custom profiles.

# Enjoy!
# ☿ 🜔 🜍 🜂 🜃 🜁 🜄