# BUG: mergetool fails on gitignore:d files

5 messages from 2009-05-30 to 2009-06-01. Participants: Erik Sandberg, Markus Heidelberg, Jeff King, Junio C Hamano.
Thread: https://gitlist.dev/t/19606

## Erik Sandberg, 2009-05-30 15:30

Subject: BUG: mergetool fails on gitignore:d files
Message-ID: <e87cdfda0905300830t6b332533g9a4298f6b8005b9e@mail.gmail.com>
URL: https://gitlist.dev/e/e87cdfda0905300830t6b332533g9a4298f6b8005b9e%40mail.gmail.com

```
If a version-controlled file is ignored by git, and a conflict arises
on the file, and I use mergetool to resolve the conflict, then
mergetool fails with a message like:

The following paths are ignored by one of your .gitignore files:
a
Use -f if you really want to add them.

The problem disappears if I edit the git-mergetool script to always
pass -f to "git add", but I'm not sure if that's the right fix; I have
a vague feeling that "git-update-index --add" could be more correct.

I have attached a script that reproduces the problem.

```

## Markus Heidelberg, 2009-05-30 16:38

Subject: Re: BUG: mergetool fails on gitignore:d files
Message-ID: <200905301838.09081.markus.heidelberg@web.de>
URL: https://gitlist.dev/e/200905301838.09081.markus.heidelberg%40web.de
In-Reply-To: <e87cdfda0905300830t6b332533g9a4298f6b8005b9e@mail.gmail.com>

```
Erik Sandberg, 30.05.2009:
> If a version-controlled file is ignored by git, and a conflict arises
> on the file, and I use mergetool to resolve the conflict, then
> mergetool fails with a message like:
> 
> The following paths are ignored by one of your .gitignore files:
> a
> Use -f if you really want to add them.
> 
> The problem disappears if I edit the git-mergetool script to always
> pass -f to "git add", but I'm not sure if that's the right fix; I have
> a vague feeling that "git-update-index --add" could be more correct.
> 
> I have attached a script that reproduces the problem.

The script would have been more readable if you haven't given both the
file and the branch name as well as the file content and the commit
message the same string "a".

Apart from that I wonder if your real repo also ignores the file 'a'
although it is tracked in every branch. If so, why do you ignore it?

Markus

```

## Jeff King, 2009-05-30 21:54

Subject: Re: BUG: mergetool fails on gitignore:d files
Message-ID: <20090530215418.GA19241@coredump.intra.peff.net>
URL: https://gitlist.dev/e/20090530215418.GA19241%40coredump.intra.peff.net
In-Reply-To: <e87cdfda0905300830t6b332533g9a4298f6b8005b9e@mail.gmail.com>

```
On Sat, May 30, 2009 at 05:30:52PM +0200, Erik Sandberg wrote:

> If a version-controlled file is ignored by git, and a conflict arises
> on the file, and I use mergetool to resolve the conflict, then
> mergetool fails with a message like:
> 
> The following paths are ignored by one of your .gitignore files:
> a
> Use -f if you really want to add them.
> 
> The problem disappears if I edit the git-mergetool script to always
> pass -f to "git add", but I'm not sure if that's the right fix; I have
> a vague feeling that "git-update-index --add" could be more correct.

Actually, I think the problem is not in mergetool at all, but with the
dir.c code underlying "git add". "git add" really should not be
complaining, because you are not adding a new path at all, but are
rather adding content to a tracked path.

So this should work (and does):

  $ echo file >.gitignore
  $ echo content >file
  $ git add -f file ;# need -f because we are adding new path
  $ echo more content >>file
  $ git add file ;# don't need -f; it is not actually an "other" file

This is handled under the hood by the COLLECT_IGNORED option to
read_directory. When that code finds an ignored file, it checks the
index to make sure it is not actually a tracked file. However, the test
it uses does not take into account unmerged entries, and considers them
to still be ignored. "git ls-files" uses a more elaborate test and gets
the right answer. So I think we want to use the same test:

---
diff --git a/dir.c b/dir.c
index 0e6b752..bbfcb56 100644
--- a/dir.c
+++ b/dir.c
@@ -396,7 +396,7 @@ static struct dir_entry *dir_add_name(struct dir_struct *dir, const char *pathna
 
 static struct dir_entry *dir_add_ignored(struct dir_struct *dir, const char *pathname, int len)
 {
-	if (cache_name_pos(pathname, len) >= 0)
+	if (!cache_name_is_other(pathname, len))
 		return NULL;
 
 	ALLOC_GROW(dir->ignored, dir->ignored_nr+1, dir->ignored_alloc);

```

## Jeff King, 2009-06-01 02:03

Subject: Re: BUG: mergetool fails on gitignore:d files
Message-ID: <20090601020349.GA32740@coredump.intra.peff.net>
URL: https://gitlist.dev/e/20090601020349.GA32740%40coredump.intra.peff.net
In-Reply-To: <20090530215418.GA19241@coredump.intra.peff.net>

```
On Sat, May 30, 2009 at 05:54:18PM -0400, Jeff King wrote:

> diff --git a/dir.c b/dir.c
> index 0e6b752..bbfcb56 100644
> --- a/dir.c
> +++ b/dir.c
> @@ -396,7 +396,7 @@ static struct dir_entry *dir_add_name(struct dir_struct *dir, const char *pathna
>  
>  static struct dir_entry *dir_add_ignored(struct dir_struct *dir, const char *pathname, int len)
>  {
> -	if (cache_name_pos(pathname, len) >= 0)
> +	if (!cache_name_is_other(pathname, len))
>  		return NULL;
>  
>  	ALLOC_GROW(dir->ignored, dir->ignored_nr+1, dir->ignored_alloc);

I was all set to write a test for this and re-submit, but you seem to
have beat me to it. Thanks. :)

-Peff

```

## Junio C Hamano, 2009-06-01 02:04

Subject: Re: BUG: mergetool fails on gitignore:d files
Message-ID: <7vk53wogku.fsf@alter.siamese.dyndns.org>
URL: https://gitlist.dev/e/7vk53wogku.fsf%40alter.siamese.dyndns.org
In-Reply-To: <20090530215418.GA19241@coredump.intra.peff.net>

```
Jeff King <peff@peff.net> writes:

> Actually, I think the problem is not in mergetool at all, but with the
> dir.c code underlying "git add". "git add" really should not be
> complaining, because you are not adding a new path at all, but are
> rather adding content to a tracked path.

Correct, and thanks.

```
