55

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?

3
  • I've been looking into git lately, and this seems to be one of the problems that might prevent us from using it, you can't selectively merge things. Commented Jan 16, 2013 at 23:02
  • the git filter-branch command may be what your looking for. It allows you to do a merge while filtering what gets merged. git-scm.com/docs/git-filter-branch Commented Jan 16, 2013 at 23:25
  • Thanks fpr the answer, yet I do not understand how I could apply filter-branch in this specific case without doing a lot of manual work for every merge. Commented Jan 17, 2013 at 8:38

2 Answers 2

90

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
Sign up to request clarification or add additional context in comments.

10 Comments

I think you should also give this answer in How to setup a git driver to ignore a folder on merge. Maybe also consider not showing the checkout step? It's irrelevant, and I think it detracts from the simplicity of the solution.
If my edit doesn't take, the reset should be git reset -- path/to/folder
It seems there is still a problem: I tried removing the untracked files - that would have been added in the directory as a result of the merge und there are some that persist. However, these were never present on the original branch, so it seems that reset and checkout did not have the desired effect completely.
shouldn't the reset be a --hard reset?
The main problem with that if you decide to merge later that folder it won't get merged, as git thinks that it has already merge that. So it is a workaround that will break your workflow
|
1

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.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.