Re: git-apply does not work in a sub-directory of a Git repository
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Mar 23, 2016, 16:55 UTC
- Message-ID
- <xmqqlh59cexj.fsf@gitster.mtv.corp.google.com>
- In-Reply-To
- <xmqqbn65dxtl.fsf@gitster.mtv.corp.google.com>
Junio C Hamano <gitster@pobox.com> writes:
Show 8 quoted lines
> See > > http://thread.gmane.org/gmane.comp.version-control.git/288316/focus=288321 > > I agree it is bad that it silently ignores the path outside the > directory. When run with --verbose, we should say "Skipped X that > is outside the directory." or something like that, just like we > issue notices when we applied with offset, etc.
Another thing we may want to do is to loosen (or redo) the logic in builtin/apply.c::use_patch()
static int use_patch(struct patch *p)
{
const char *pathname = p->new_name ? p->new_name : p->old_name;
int i; /* Paths outside are not touched regardless of "--include" */
if (0 < prefix_length) {
int pathlen = strlen(pathname);
if (pathlen <= prefix_length ||
memcmp(prefix, pathname, prefix_length))
return 0;
}The include/exclude mechanism does use wildmatch() but does not use the pathspec mechanism (it predates the pathspec machinery that was made reusable in places like this). We should be able to
$ cd d/e/e/p/d/i/r
$ git apply --include=:/ ../../../../../../../patchto lift this limitation. IOW, we can think of the use_patch() to include only the paths in the subdirectory we are in by default, but we can make it allow --include/--exclude command line option to override that default.
That way, the plain-vanilla use would still retain the "when working in subdirectory, we only touch that subdirectory" behaviour, which existing scripts may depend on, but users can loosen the default as necessary.