Sebastian Thiebes
Sebastian Thiebes

Reputation: 553

How to make git ignore a directory while merging

As interesting and useful as the answer to How to setup a git driver to ignore a folder on merge was, it did not answer the original question which still has me stumped.

Unlike the question linked to above, I have two branches with the same set of directories and for merging one into the other I need git to ignore one directory completely.

I tried it with my own merge driver as described in How do I tell git to always select my local version for conflicted merges on a specific file? but the problem with this approach is that this driver is only invoked when there is an actual conflicting file in these two branches. Whenever the changes of a file are only on one branch, git merges them without calling my merge driver.

This leads to changes in files in the directory that I do not want. Any idea how I could make git ignore each and every file in that directory all the time - whether it was touched or not?

Upvotes: 55

Views: 34573

Answers (2)

Gavin Kwok
Gavin Kwok

Reputation: 108

Let's say I'm on branch staging want to merge dev and ignore changes in /build folder:

git checkout staging
# go to staging branch

git checkout dev .
# this checkout dev file changes into staging

git reset HEAD build
# this remove added file in build folder

git clean -f
# this drops untracked files we just reseted

git checkout -- .
# this drops changed files we just rested

git status
# check is everything ok

git commit -am 'merge dev into branch'
# create a commit

git merge -s ours dev
# this create a fake merge to trick Git into thinking that a branch is already merged when doing a merge later on.

this solution is not perfect because it will merge all commits into one. which means cherry-pick some commits may not suitable.

but it's able to avoid lots of commit in build folder caused by rename/new/delete that need to clean up.

Upvotes: 1

user606723
user606723

Reputation: 5145

I don't actually use Git, but I think this would work for your case:

Use something like what's specified here: https://gist.github.com/564416

git checkout master    
git merge --no-commit --no-ff development
git reset -- /path/to/folder # revert updates from path
git commit

Again, I don't use git, I am just deferring to how I think things work based on my experience with TryGit.

  1. checkout master
  2. merge, but don't commit, no fast forward.
  3. merges are now staged, so reset that entire directory tree
  4. commit

Upvotes: 90

Related Questions