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

[PATCH/RFC 00/15] Fix git-gc losing objects in multi worktree

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Feb 17, 2017, 14:18 UTC
Message-ID
<20170217141908.18012-1-pclouds@gmail.com>

So here is my latest attempt on fixing this issue. For people who are not aware of it, git-gc does not take per-worktree refs, reflogs and indexes into account. An odb prune may leave HEAD and references in other worktrees pointing to nowhere.

This series is based on my "kill parse_ref()" series [1], which is based on yet another one, which is on top of mh/submodule-hash. But you can get everything from my github [2].

The series introduces a new set of refs_* API and replaces the old *_submodule() one, opening up the opportunity to access refs from another worktree. rev-list learns a new option, --single-worktree, to control the new behavior.

reflog iterator from files-backend.c does not support per-worktree items, so it's updated here to do that. It still looks ugly, but I think this is a good "middle ground" until compound ref store comes. At that point we can separate "single worktree" ref store vs "linked worktree" one.

I'm adding Stefan here as well since I added a new FIXME in submodule.c in 11/15. I think it's ok (again, for now). But another look from submodule people would be much better.

[1] http://public-inbox.org/git/%3C20170216120302.5302-1-pclouds@gmail.com%3E/ [2] https://github.com/pclouds/git/commits/prune-in-worktrees-2

Nguyễn Thái Ngọc Duy (15):
  revision.h: new flag in struct rev_info wrt. worktree-related refs
  revision.c: refactor add_index_objects_to_pending()
  revision.c: --indexed-objects add objects from all worktrees
  refs: move submodule slash stripping code to get_submodule_ref_store
  refs: add refs_read_ref[_full]()
  refs: add refs_head_ref()
  refs: add refs_for_each_ref()
  refs: add a refs_for_each_in() and friends
  revision.c: use refs_for_each*() instead of for_each_*_submodule()
  refs: remove dead for_each_*_submodule()
  revision.c: --all adds HEAD from all worktrees
  refs: add refs_for_each_reflog[_ent]()
  files-backend: make reflog iterator go through per-worktree reflog
  revision.c: --reflog add HEAD reflog from all worktrees
  rev-list: expose and document --single-worktree
 Documentation/rev-list-options.txt |   8 ++
 reachable.c                        |   1 +
 refs.c                             | 171 ++++++++++++++++++++++++-------------
 refs.h                             |  25 ++++--
 refs/files-backend.c               |  24 +++++-
 revision.c                         | 130 +++++++++++++++++++++++-----
 revision.h                         |   1 +
 submodule.c                        |   2 +
 t/t5304-prune.sh                   |  37 ++++++++
 9 files changed, 305 insertions(+), 94 deletions(-)
-- 
2.11.0.157.gd943d85
Next: Nguyễn Thái Ngọc Duy
Message 1 of 33 in “Fix git-gc losing objects in multi worktree”
  1. 00/15 Fix git-gc losing objects in multi worktreeNguyễn Thái Ngọc Duy, Feb 17, 2017
  2. 01/15 revision.h: new flag in struct rev_info wrt. worktree-related refsNguyễn Thái Ngọc Duy, Feb 17, 2017
  3. 02/15 revision.c: refactor add_index_objects_to_pending()Nguyễn Thái Ngọc Duy, Feb 17, 2017
  4. 03/15 revision.c: --indexed-objects add objects from all worktreesNguyễn Thái Ngọc Duy, Feb 17, 2017
  5. 04/15 refs: move submodule slash stripping code to get_submodule_ref_storeNguyễn Thái Ngọc Duy, Feb 17, 2017
  6. 06/15 refs: add refs_head_ref()Nguyễn Thái Ngọc Duy, Feb 17, 2017
  7. 05/15 refs: add refs_read_ref[_full]()Nguyễn Thái Ngọc Duy, Feb 17, 2017
  8. 07/15 refs: add refs_for_each_ref()Nguyễn Thái Ngọc Duy, Feb 17, 2017
  9. 08/15 refs: add a refs_for_each_in() and friendsNguyễn Thái Ngọc Duy, Feb 17, 2017
  10. 09/15 revision.c: use refs_for_each*() instead of for_each_*_submodule()Nguyễn Thái Ngọc Duy, Feb 17, 2017
  11. 10/15 refs: remove dead for_each_*_submodule()Nguyễn Thái Ngọc Duy, Feb 17, 2017
  12. 12/15 refs: add refs_for_each_reflog[_ent]()Nguyễn Thái Ngọc Duy, Feb 17, 2017
  13. 11/15 revision.c: --all adds HEAD from all worktreesNguyễn Thái Ngọc Duy, Feb 17, 2017
  14. 13/15 files-backend: make reflog iterator go through per-worktree reflogNguyễn Thái Ngọc Duy, Feb 17, 2017
  15. 14/15 revision.c: --reflog add HEAD reflog from all worktreesNguyễn Thái Ngọc Duy, Feb 17, 2017
  16. 15/15 rev-list: expose and document --single-worktreeNguyễn Thái Ngọc Duy, Feb 17, 2017
  17. Johannes SchindelinFeb 17, 2017
  18. 00/12 Fix git-gc losing objects in multi worktreeNguyễn Thái Ngọc Duy, Mar 18, 2017
  19. 03/12 revision.c: --indexed-objects add objects from all worktreesNguyễn Thái Ngọc Duy, Mar 18, 2017
  20. 04/12 refs.c: refactor get_submodule_ref_store(), share common free blockNguyễn Thái Ngọc Duy, Mar 18, 2017
  21. 01/12 revision.h: new flag in struct rev_info wrt. worktree-related refsNguyễn Thái Ngọc Duy, Mar 18, 2017
  22. 06/12 refs: add refs_head_ref()Nguyễn Thái Ngọc Duy, Mar 18, 2017
  23. 02/12 revision.c: refactor add_index_objects_to_pending()Nguyễn Thái Ngọc Duy, Mar 18, 2017
  24. 05/12 refs: move submodule slash stripping code to get_submodule_ref_storeNguyễn Thái Ngọc Duy, Mar 18, 2017
  25. 12/12 rev-list: expose and document --single-worktreeNguyễn Thái Ngọc Duy, Mar 18, 2017
  26. Junio C HamanoMar 18, 2017
  27. Duy NguyenApr 19, 2017
  28. Junio C HamanoApr 20, 2017
  29. 10/12 files-backend: make reflog iterator go through per-worktree reflogNguyễn Thái Ngọc Duy, Mar 18, 2017
  30. 09/12 revision.c: --all adds HEAD from all worktreesNguyễn Thái Ngọc Duy, Mar 18, 2017
  31. 11/12 revision.c: --reflog add HEAD reflog from all worktreesNguyễn Thái Ngọc Duy, Mar 18, 2017
  32. 08/12 refs: remove dead for_each_*_submodule()Nguyễn Thái Ngọc Duy, Mar 18, 2017
  33. 07/12 revision.c: use refs_for_each*() instead of for_each_*_submodule()Nguyễn Thái Ngọc Duy, Mar 18, 2017

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.