Unfortunately (or so I sometimes feel), the configuration and hooks are not stored in the tree (the version controlled part of repo), and must be installed out of band. This easily leads to a non-uniform configuration across clones.
Let's get that information in band!
I tend to place any configuration I want to persist into a
.gitconfig file, and take advantage of the
include.path variable. From the docs:
You can include one config file from another by setting the special include.path variable to the name of the file to be included. [...] If the value of the include.path variable is a relative path, the path is considered to be relative to the configuration file in which the include directive was found.
The key is that the
include.path is relative; a simple leading
.. will let you refer to the working directory.
Next, any hooks that I want to persist go into a
git-setup.sh script will install them both:
# Install local config. if [[ -f .gitconfig ]]; then git config --add include.path ../.gitconfig fi # Install local hooks. if [[ -d .githooks ]]; then chmod +x .githooks/* for hook in .githooks/*; do ln -sf ../../$hook .git/hooks/ done fi
Now one only needs to run
. git-setup.sh once after cloning the repository to set up a repeatable environment. There is still a manual element there, but at least it is now very consistent.