Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Keep a different configuration file (untracked) for each branch

Tags:

git

gitignore

In a git repository I have two files: config/conf.yaml.sample (which is tracked by git, but it's ignored when my program is launched) and a copy of it called config/conf.yaml (which is ignored by git, but it's read when my program is launched).

When I switch from branch A to branch B I always have the same configuration file (because config/conf.yaml is untracked) and that means, for example, that each branch relates to the same database, same ports, and so on.

I want to keep a different config/conf.yaml for each branch, so that it changes when switching branches, but I don't want to have git track it (e.g. because it contains the name and password to access the database).

How can I do it?

like image 330
William Avatar asked Sep 30 '22 00:09

William


1 Answers

It seems that Git's post-checkout hook is right up your alley:

This hook is invoked when a git checkout is run after having updated the worktree. The hook is given three parameters: the ref of the previous HEAD, the ref of the new HEAD (which may or may not have changed), and a flag indicating whether the checkout was a branch checkout (changing branches, flag=1) or a file checkout (retrieving a file from the index, flag=0). This hook cannot affect the outcome of git checkout.

It is also run after git clone, unless the --no-checkout (-n) option is used. The first parameter given to the hook is the null-ref, the second the ref of the new HEAD and the flag is always 1.

This hook can be used to perform repository validity checks, auto-display differences from the previous HEAD if different, or set working dir metadata properties.

The following script (which must be made executable) should get you started; modify it to suit your needs and save it as .git/hooks/post-checkout:

#!/bin/sh
#
# An example post-checkout hook script to perform an action conditionally on
# the branch (if any) just checked out.
# 
# Test whether a branch was just checked out
if [ "$3" -eq 1 ]; then
    # Save the value of HEAD (do not issue an error if HEAD is detached) 
    symrefHEAD=`git symbolic-ref --quiet HEAD`
    if [  "$symrefHEAD" = "refs/heads/master" ]; then
        # Do something useful for master, e.g.
        # cp config/conf_master.yaml config/conf.yaml
        printf " --- test: You just checked out master. ---\n"
    elif [ "$symrefHEAD" = "refs/heads/develop" ] ; then
        # Do something useful for develop, e.g.
        # cp config/conf_develop.yaml config/conf.yaml
        printf "--- test: You just checked out develop. ---\n"
    else
        # default case
        printf "You just checked out some other branch.\n"
    fi
else
    printf "No branch was checked out\n"
fi
like image 62
jub0bs Avatar answered Oct 09 '22 04:10

jub0bs