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

Re: git gc and worktrees

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Jun 1, 2016, 16:12 UTC
Message-ID
<574F0983.5030108@alum.mit.edu>
In-Reply-To
<xmqqbn3l0wkv.fsf@gitster.mtv.corp.google.com>
On 06/01/2016 05:15 PM, Junio C Hamano wrote:
Show 8 quoted lines
> Michael Haggerty <mhagger@alum.mit.edu> writes:
> 
>> I think reference stores are going to need two distinct types of
>> reference iteration: one to iterate over the *logical* reference space
>> of a single repo or worktree, and one to find all *local* references
>> and/or reachability roots (e.g., when run within a linked repo).
> 
> This is hard reason about without defining *logical* and *local*.

By "logical" I mean the references that appear to be available in the specified repository. Roughly, "what reference names can I pass to `git rev-parse`?" If you are in a linked repo, your "logical" references are most of those in the main repo plus the "HEAD" and "refs/bisect/*" and probably a couple other pseudo-refs that are stored in your worktree.

"Local" is probably a bad name. What I mean is that we have multiple physical places to store references. In particular, in the case of linked repos we have the main repo's references plus we have the worktree's local references.

Most Git commands care only about the "logical" references in the repo. But some commands (mostly having to do with reachability) need to know about all roots, and therefore have to know about the union of all of the references stored in each of the linked repositories.

Note that in the second case it is a little silly even talking about "references", because references in different linked repos might have the same names. We're really talking about reachability roots that might have a little metadata connected with them, like "this SHA-1 came from reference 'HEAD' in the 'test' worktree" or "this SHA-1 came from the reflog of 'refs/heads/master' in the main repo".

I argue that the fundamental concept in terms of the implementation should be the individual physical reference stores, and these should be compounded together to form the logical reference collections and the sets of reachability roots that are interesting at the UI level.

Show 7 quoted lines
> For protecting necessary objects from pruning by anchoring them as
> "reachable", and for avoiding unnecessary object transfer by showing
> things via ".have" lines, we're better consider references and
> reflogs that do not appear in the namespace visible from the current
> worktree.  I wanted to come up with an example of wanting to iterate
> over refs of the current worktree, but other than "what are my
> branches including HEAD?" I didn't think of anything interesting.
It doesn't show up much at the UI level, but there are some examples, like
* git log --decorate
* git for-each-ref --contains
* gitk --all
> [...]
Michael
Previous: Junio C HamanoNext: Junio C Hamano
Message 7 of 25 in “git gc and worktrees”
  1. Johannes SixtMay 31, 2016
  2. Duy NguyenMay 31, 2016
  3. Jeff KingMay 31, 2016
  4. Johannes SixtJun 1, 2016
  5. Michael HaggertyJun 1, 2016
  6. Junio C HamanoJun 1, 2016
  7. Michael HaggertyJun 1, 2016
  8. Junio C HamanoJun 1, 2016
  9. Michael HaggertyJun 2, 2016
  10. Junio C HamanoJun 3, 2016
  11. 0/4 Fix prune/gc problem with multiple worktreesNguyễn Thái Ngọc Duy, Jun 1, 2016
  12. 1/4 revision.c: move read_cache() out of add_index_objects_to_pending()Nguyễn Thái Ngọc Duy, Jun 1, 2016
  13. 2/4 reachable.c: mark reachable objects in index from all worktreesNguyễn Thái Ngọc Duy, Jun 1, 2016
  14. Eric SunshineJun 1, 2016
  15. Duy NguyenJun 2, 2016
  16. David TurnerJun 1, 2016
  17. Duy NguyenJun 2, 2016
  18. 3/4 reachable.c: mark reachable detached HEAD from all worktreesNguyễn Thái Ngọc Duy, Jun 1, 2016
  19. 4/4 reachable.c: make reachable reflogs for all per-worktree reflogsNguyễn Thái Ngọc Duy, Jun 1, 2016
  20. Michael HaggertyJun 1, 2016
  21. Jeff KingJun 1, 2016
  22. Junio C HamanoJun 1, 2016
  23. Duy NguyenJun 2, 2016
  24. Michael HaggertyJun 2, 2016
  25. Junio C HamanoJun 2, 2016

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.