Skip to content

Instantly share code, notes, and snippets.

@wizioo
Last active May 2, 2024 15:42
Show Gist options
  • Save wizioo/c89847c7894ede628071 to your computer and use it in GitHub Desktop.
Save wizioo/c89847c7894ede628071 to your computer and use it in GitHub Desktop.
HowTo have specific .gitignore for each git branch

How to have specific .gitignore for each git branch

Objective

My objective is to have some production files ignored on specific branches. Git doesn't allow to do it.

Solution

My solution is to make a general .gitignore file and add .gitignore.branch_name files for the branches I want to add specific file exclusion. I'll use post-checkout hook to copy those .gitignore.branch_name in place of .git/info/exclude each time I go to the branch with git checkout branch_name.

Steps

  1. Create new .gitignore files for each branch and name it like this : .gitignore.branch_name
  2. In your git repo, go to .git/hooks/
  3. Edit or create post-checkout file and copy the content found in this gist.
  4. Don't forget to make it executable with chmod 755 post-checkout
  5. Just go to the branch you want and type git status: TADAAA !
#!/bin/sh
old_ref=$1
new_ref=$2
branch_switched=$3
if [[ $branch_switched != '1' ]]
then
exit 0
fi
echo "---- POST CHECKOUT ----"
current_branch=$(git rev-parse --abbrev-ref HEAD)
hook_dir=$(dirname $0)
root_dir="$(pwd -P)"
info_dir="$root_dir/.git/info"
exclude_target='.gitignore'
if [[ -f "$root_dir/$exclude_target.$current_branch" ]]
then
echo "Prepare to use .gitignore.$current_branch as exclude file"
exclude_target=.gitignore.$current_branch
fi
cd "$info_dir"
rm exclude
#ln -s $exclude_target exclude
echo "Copy .gitignore.$current_branch file in place of exclude"
cp "$root_dir/$exclude_target" exclude
echo "--- POST CHECKOUT END ---"
@hyperfield
Copy link

hyperfield commented Aug 15, 2021

Thank you for the script. Can you please clarify the following error message? I'd like to figure out how to properly use your script.

git checkout web
Already on 'web'
.git/hooks/post-checkout: 7: [[: not found
---- POST CHECKOUT ----
.git/hooks/post-checkout: 18: [[: not found
Copy .gitignore.web file in place of exclude
--- POST CHECKOUT END ---

I've tried this:
cp .gitignore.web .git/info/exclude
No luck yet.

@dberardo-com
Copy link

dberardo-com commented Jun 6, 2022

2 questions here:

  1. is there any way to commit the git hook on the remote ? (using github/gitlab?)
  2. can we have only one gitignore file for a specific branch and not 1 gitignore for each branch in the repo (which might be too many to keep track of) ?

i am asking this because if one uses only one remote, no matter what the client does ignore, the "per-branch" ignored folders will be found on all branches on the remote, which strongly limits the power of this solution

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment