Re: Bug?: git archive exclude pathspec and gitattributes export-ignore
- From
- David Adam <zanchey@ucc.gu.uwa.edu.au>
- Date
- Aug 15, 2017, 02:39 UTC
- Message-ID
- <alpine.DEB.2.11.1708151027350.9062@motsugo.ucc.gu.uwa.edu.au>
- In-Reply-To
- <ae893c19-652d-1c8f-50ba-1242b95be84e@web.de>
On Mon, 14 Aug 2017, René Scharfe wrote:
Show 20 quoted lines
> Am 13.08.2017 um 06:53 schrieb David Adam: > > I think I have a bug in git (tested 2.11.0 on Debian 8, 2.14.1 on OS X and > > 2.14.1.145.gb3622a4 on OS X). > > > > Given a repository with an export-ignore directive for a subdirectory in > > .gitattributes, `git archive` with a pathspec that excludes a different > > subdirectory produces no output file and git exits with -1 as the return > > status. > > Thanks for the thoughtful bug report! > > The problem seems to be that archive.c::write_archive_entry() returns 0 > instead of READ_TREE_RECURSIVE for directories with the attribute > "export-ignore", and archive.c::write_directory() gets caught by > surprise by that and returns -1, which ends up causing git archive to > exit with return code 255 without actually writing anything. > > This should only happen if you use wildcards like "*", i.e. git archive > should behave as expected if you spell out the full name of the > directory. Can you confirm that?
Yes - that's definitely the case.
The reason I am trying to use the wildcard is that using an ":(exclude)b" pathspec excludes the contents of, but not the actual b directory itself:
> git archive HEAD ':(top)' ':(exclude)b' | tar t
.gitattributes
b/Whereas I would like to export the archive without the b directory entirely.
> The real solution is probably to teach tree-walk.c::do_match() how to > handle attributes and then inject ":(attr:-export-ignore)" as a default > internal pathspec in archive.c::parse_pathspec_arg() instead of handling > it in archive.c::write_archive_entry().
Many thanks
David Adam zanchey@ucc.gu.uwa.edu.au