threads / discuss / 27202

git sparse checkout exclusions not working?

Subject: git sparse checkout exclusions not working?

## tl;dr

3 messages between Apr 27, 2011 and Apr 30, 2011.

replies: 2people: 2as markdown or json

skillzero@gmail.com· Apr 27, 2011, 16:35 UTC · lore

It seems like ! patterns in the sparse-checkout file don't exclude individual files in a directory. Here's what I did:

git init mkdir test1 echo "test1" test1/file1.txt echo "test2" test1/file2.txt echo "test3" test1/file3.txt mkdir test2 echo "test2" test2/file1.txt echo "test2" test2/file2.txt echo "test2" test2/file3.txt git add . git commit -m "test" git config core.sparseCheckout true

echo 'test1/' > .git/info/sparse-checkout echo '!test1/file2.txt' >> .git/info/sparse-checkout git checkout master --

The end result is like this:

test1 test1/file1.txt test1/file2.txt test1/file3.txt

The "test1" directory was included, but "test1/file2.txt" wasn't excluded even though I added a ! pattern for it. The test2 directory was correctly excluded so that makes me think sparse was working in general, but just not respecting the ! pattern in this case.

Is this a bug or am I doing something wrong?
Nguyen Thai Ngoc Duy· Apr 29, 2011, 12:10 UTC · re: skillzero@gmail.com · lore

Re: git sparse checkout exclusions not working?

On Wed, Apr 27, 2011 at 11:35 PM,  <skillzero@gmail.com> wrote:
Show 11 quoted lines
> It seems like ! patterns in the sparse-checkout file don't exclude
> individual files in a directory. Here's what I did:
>
> ...
>
> The "test1" directory was included, but "test1/file2.txt" wasn't
> excluded even though I added a ! pattern for it. The test2 directory
> was correctly excluded so that makes me think sparse was working in
> general, but just not respecting the ! pattern in this case.
>
> Is this a bug or am I doing something wrong?

I can reproduce it too. It looks like a regression from whole-directory matching. If a directory is matched, all files inside are considered "in". Let's see if I can come up with something this weekend.

-- 
Duy
Nguyen Thai Ngoc Duy· Apr 30, 2011, 10:06 UTC · re: Nguyen Thai Ngoc Duy · lore

Re: git sparse checkout exclusions not working?

On Fri, Apr 29, 2011 at 7:10 PM, Nguyen Thai Ngoc Duy <pclouds@gmail.com> wrote:
Show 17 quoted lines
> On Wed, Apr 27, 2011 at 11:35 PM,  <skillzero@gmail.com> wrote:
>> It seems like ! patterns in the sparse-checkout file don't exclude
>> individual files in a directory. Here's what I did:
>>
>> ...
>>
>> The "test1" directory was included, but "test1/file2.txt" wasn't
>> excluded even though I added a ! pattern for it. The test2 directory
>> was correctly excluded so that makes me think sparse was working in
>> general, but just not respecting the ! pattern in this case.
>>
>> Is this a bug or am I doing something wrong?
>
> I can reproduce it too. It looks like a regression from
> whole-directory matching. If a directory is matched, all files inside
> are considered "in". Let's see if I can come up with something this
> weekend.

sparse checkout rules are not the only ones falling for this trap. .gitignore has the same problem:

pclouds@do /tmp/z $ cat .gitignore t !t/1 pclouds@do /tmp/z $ ls t 1 2 3 pclouds@do /tmp/z $ git init Initialized empty Git repository in /tmp/z/.git/ pclouds@do /tmp/z $ ~/w/git/git add . pclouds@do /tmp/z $ git ls-files .gitignore

I wonder if we can convert struct exclude to struct pathspec and solve the problem all at the same place. Granted .gitignore's '*' is different from pathspec's '*' (ie. FNM_PATHNAME vs no flag to fnmatch), but struct pathspec can be taught to do it both ways and the pathspec magic can expose FNM_PATHNAME to users too.

-- 
Duy

← back to recent threads