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@xxxxxxxxx%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