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

Re: Proposal: object negotiation for partial clones

From
Matthew DeVore <matvore@comcast.net>
Date
May 14, 2019, 00:09 UTC
Message-ID
<4A3BD0B7-894F-4FB0-A3BA-15675F60046C@comcast.net>
In-Reply-To
<20190509180022.91700-1-jonathantanmy@google.com>
Show 5 quoted lines
> On 2019/05/09, at 11:00, Jonathan Tan <jonathantanmy@google.com> wrote:
> 
> Thanks for the numbers. Let me think about it some more, but I'm still
> reluctant to introduce multiple filter support in the protocol and the
> implementation for the following reasons:
Correction to the original command - I was tweaking it in the middle of running it, and introduced an error that I didn’t notice. Here is one that will work for an entire repo:
$ git rev-list --objects --filter=blob:none HEAD: | awk '{print $1}' | xargs -n 1 git cat-file -s  | awk '{ total += $1; print total }'
When run to completion, Chromium totaled 17 301 144 bytes.
> 
> - For large projects like Linux and Chromium, it may be reasonable to
>  expect that an infrequent checkout would result in a few-megabyte
>  download.
Anyone developing on Chromium would definitely consider a 17 MB original clone to be an improvement over the status quo, but it is still not ideal.
And the 17MB initial download is only incurred once *assuming* the next idea is implemented:
> - (After some in-office discussion) It may be possible to mitigate much
>  of that by sending root trees that we have as "have" (e.g. by
>  consulting the reflog), and that wouldn't need any protocol change.
This would complicate the code - not in Git itself, but in my FUSE-related logic. We would have to explore the reflog and try to find the closest commits in history to the target commit being checked out. This is sounding a bit hacky and round-about, and it assumes that at the FUSE layer we can detect when a checkout is happening cleanly and sufficiently early (rather than when one of the sub-sub-trees is being accessed).
Show 6 quoted lines
> - Supporting any combination of filter means that we have more to
>  implement and test, especially if we want to support more filters in
>  the future. In particular, the different filters (e.g. blob, tree)
>  have different code paths now in Git. One way to solve it would be to
>  combine everything into one monolith, but I would like to avoid it if
>  possible (after having to deal with revision walking a few times...)
I don’t believe there is any need to introduce monolithic code. The bulk of the filter implementation is in list-objects-filter.c, and I don’t think the file will get much longer with an additional filter that “combines” the existing filter. The new filter is likely simpler than the sparse filter. Once I add the new filter and send out the initial patch set, we can discuss splitting up the file, if it appears to be necessary.
My idea - if it is not clear already - is to add another OO-like interface to list-objects-filter.c which parallels the 5 that are already there.
Previous: Jonathan TanNext: Jonathan Nieder
Message 11 of 23 in “Proposal: object negotiation for partial clones”
  1. Matthew DeVoreApr 28, 2019
  2. Jonathan NiederMay 6, 2019
  3. Jonathan TanMay 6, 2019
  4. Jonathan NiederMay 6, 2019
  5. Matthew DeVoreMay 6, 2019
  6. Jonathan NiederMay 7, 2019
  7. Matthew DeVoreMay 6, 2019
  8. Jonathan TanMay 7, 2019
  9. Matthew DeVoreMay 7, 2019
  10. Jonathan TanMay 9, 2019
  11. Matthew DeVoreMay 14, 2019
  12. Jonathan NiederMay 14, 2019
  13. 0/3 implement composite filtersMatthew DeVore, May 16, 2019
  14. 1/3 list-objects-filter: refactor into a context structMatthew DeVore, May 16, 2019
  15. 2/3 list-objects-filter-options: error is localizeableMatthew DeVore, May 16, 2019
  16. 3/3 list-objects-filter: implement composite filtersMatthew DeVore, May 16, 2019
  17. Junio C HamanoMay 17, 2019
  18. Matthew DeVoreMay 17, 2019
  19. Junio C HamanoMay 19, 2019
  20. Matthew DeVoreMay 20, 2019
  21. Matthew DeVoreMay 20, 2019
  22. Jonathan TanMay 16, 2019
  23. Matthew DeVoreMay 17, 2019

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.