git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [RFC PATCH 05/15] read_tree_recursive: Avoid missing blobs and trees in a sparse repository

From
Elijah Newren <newren@gmail.com>
Date
Sep 5, 2010, 04:31 UTC
Message-ID
<AANLkTimH_iMvvOadoCx_DJybDpzS3eNe92-6ywzdgUUk@mail.gmail.com>
In-Reply-To
<AANLkTimsqDbtXArL_EQc+ZCqOd=tYWJ1ZXZpa7T5qUiH@mail.gmail.com>
On Sat, Sep 4, 2010 at 9:16 PM, Elijah Newren <newren@gmail.com> wrote:
Show 18 quoted lines
> On Sat, Sep 4, 2010 at 8:00 PM, Nguyen Thai Ngoc Duy <pclouds@gmail.com> wrote:
>> On Sun, Sep 5, 2010 at 10:13 AM, Elijah Newren <newren@gmail.com> wrote:
>>> @@ -119,6 +119,11 @@ int read_tree_recursive(struct tree *tree,
>>>                default:
>>>                        return -1;
>>>                }
>>> +
>>> +               if (git_sparse_pathspecs &&
>>> +                   sha1_object_info(entry.sha1, NULL) <= 0)
>>> +                       continue;
>>> +
>>
>> I suppose this is temporary and the final solution would have stricter
>> checks (i.e. only ignore if those entries are outside sparse zone)?
>> This opens a door for broken repo.
>
> Yes, good catch.  Looks like I somehow missed that one, but I agree,
> there should be an "&& !tree_entry_interesting(...)" in there.
Sorry, now I remember why that isn't in there and can't be.  I did
have it there at one point. However, base & baselen in
read_tree_recursive do not necessarily correspond to the relative path
from the toplevel of the repository, though the sparse limit pathspecs
always will.  For example, running
  git ls-tree master:Documentation/technical
or, equivalently (for current git.git)
  git ls-tree da0ae7c59bb0df4c13554fd840e1a563cde659ea
then base will be "" for paths under Documentation/technical rather
than "Documenation/technical/".  And there's really no way of
determining the "real base" either in order to apply matching to the
sparse limit pathspecs (well...I guess you could do an exhaustive walk
of all history each time, so long as the given sha1sum only appears as
one particular directory, but that's unrealistic and slow and leaves
open what to do when multiple directories at different paths happen to
have the same sha1sum at some point(s) in their history).  Note that
this affects cat-file -p as well, since it calls ls-tree and thus this
code.

I really don't see how one can change this. However, if it's any consolation, sha1_object_info() will print out a warning message whenever it's asked for a sha1sum that cannot be found in the object store. For example, in a sparse clone:

$ git ls-tree -rt master 040000 tree f98bf35e9a746ebbd5a706591fe1ea4942942bad sub 040000 tree 436913a91c5648a6ed8fa23719fbd6e3052e2597 sub/a error: unable to find 436913a91c5648a6ed8fa23719fbd6e3052e2597 040000 tree 07753f428765ac1afe2020b24e40785869bd4a85 sub/b 100644 blob d95f3ad14dee633a758d2e331151e950dd13e4ed sub/b/file 040000 tree 07753f428765ac1afe2020b24e40785869bd4a85 sub/bcopy 100644 blob d95f3ad14dee633a758d2e331151e950dd13e4ed sub/bcopy/file 100644 blob 4b7b65e07a8641bcd14375ebddf5c8a7fc002a30 sub/file

It can't traverse into sub/a because it doesn't have the necessary information. I figured the warning message was useful to the end user as a reminder that they are in a sparse clone. (Such warning messages don't affect cat-file -p, because its callbacks don't return READ_TREE_RECURSIVE, making sure it doesn't trigger this part of the code.)

Previous: Elijah NewrenNext: Elijah Newren
Message 12 of 41 in “Sparse clones”
  1. 00/15 Sparse clonesElijah Newren, Sep 5, 2010
  2. 01/15 README-sparse-clone: Add a basic writeup of my ideas for sparse clonesElijah Newren, Sep 5, 2010
  3. Nguyen Thai Ngoc DuySep 5, 2010
  4. Elijah NewrenSep 5, 2010
  5. Nguyen Thai Ngoc DuySep 6, 2010
  6. 02/15 Add tests for client handling in a sparse repositoryElijah Newren, Sep 5, 2010
  7. 03/15 Read sparse limiting args from $GIT_DIR/sparse-limitElijah Newren, Sep 5, 2010
  8. 04/15 When unpacking in a sparse repository, avoid traversing missing trees/blobsElijah Newren, Sep 5, 2010
  9. 05/15 read_tree_recursive: Avoid missing blobs and trees in a sparse repositoryElijah Newren, Sep 5, 2010
  10. Nguyen Thai Ngoc DuySep 5, 2010
  11. Elijah NewrenSep 5, 2010
  12. Elijah NewrenSep 5, 2010
  13. 06/15 Automatically reuse sparse limiting arguments in revision walkingElijah Newren, Sep 5, 2010
  14. Nguyen Thai Ngoc DuySep 5, 2010
  15. Elijah NewrenSep 5, 2010
  16. Nguyen Thai Ngoc DuySep 5, 2010
  17. 07/15 cache_tree_update(): Capability to handle tree entries missing from indexElijah Newren, Sep 5, 2010
  18. Nguyen Thai Ngoc DuySep 5, 2010
  19. Elijah NewrenSep 5, 2010
  20. Elijah NewrenSep 6, 2010
  21. Nguyen Thai Ngoc DuySep 6, 2010
  22. 0/4 en/object-list-with-pathspec updateNguyễn Thái Ngọc Duy, Sep 6, 2010
  23. 1/4 Add testcases showing how pathspecs are ignored with rev-list --objectsNguyễn Thái Ngọc Duy, Sep 6, 2010
  24. 2/4 tree-walk: copy tree_entry_interesting() as is from tree-diff.cNguyễn Thái Ngọc Duy, Sep 6, 2010
  25. Elijah NewrenSep 6, 2010
  26. Nguyen Thai Ngoc DuySep 6, 2010
  27. 3/4 tree-walk: actually move tree_entry_interesting() to tree-walk.cNguyễn Thái Ngọc Duy, Sep 6, 2010
  28. Elijah NewrenSep 6, 2010
  29. Nguyen Thai Ngoc DuySep 6, 2010
  30. Junio C HamanoSep 6, 2010
  31. 4/4 Make rev-list --objects work together with pathspecsNguyễn Thái Ngọc Duy, Sep 6, 2010
  32. Nguyen Thai Ngoc DuySep 7, 2010
  33. Elijah NewrenSep 7, 2010
  34. 08/15 cache_tree_update(): Require relevant tree to be passedElijah Newren, Sep 5, 2010
  35. 09/15 Add tests for communication dealing with sparse repositoriesElijah Newren, Sep 5, 2010
  36. 10/15 sparse-repo: Provide a function to record sparse limiting argumentsElijah Newren, Sep 5, 2010
  37. 11/15 builtin-clone: Accept paths for sparse cloneElijah Newren, Sep 5, 2010
  38. 12/15 Pass extra (rev-list) args on, at least in some casesElijah Newren, Sep 5, 2010
  39. 13/15 upload-pack: Handle extra rev-list arguments being passedElijah Newren, Sep 5, 2010
  40. 14/15 EVIL COMMIT: Include all commitsElijah Newren, Sep 5, 2010
  41. 15/15 clone: Ensure sparse limiting arguments are used in subsequent operationsElijah Newren, Sep 5, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.