path: root/worktree.c
diff options
authorJunio C Hamano <>2017-09-19 01:47:53 (GMT)
committerJunio C Hamano <>2017-09-19 01:47:53 (GMT)
commit8a044c7f1d56cef657be342e40de0795d688e882 (patch)
treeb5d4380a0379d2f8d47fd91a130ecb4cea503a30 /worktree.c
parentdafbe1993e54bccb80501a98812105a7bcddc748 (diff)
parent873ea90d61fa45ec91af3864c2e336bfe489d181 (diff)
Merge branch 'nd/prune-in-worktree'
"git gc" and friends when multiple worktrees are used off of a single repository did not consider the index and per-worktree refs of other worktrees as the root for reachability traversal, making objects that are in use only in other worktrees to be subject to garbage collection. * nd/prune-in-worktree: refs.c: reindent get_submodule_ref_store() refs.c: remove fallback-to-main-store code get_submodule_ref_store() rev-list: expose and document --single-worktree revision.c: --reflog add HEAD reflog from all worktrees files-backend: make reflog iterator go through per-worktree reflog revision.c: --all adds HEAD from all worktrees refs: remove dead for_each_*_submodule() refs.c: move for_each_remote_ref_submodule() to submodule.c revision.c: use refs_for_each*() instead of for_each_*_submodule() refs: add refs_head_ref() refs: move submodule slash stripping code to get_submodule_ref_store refs.c: refactor get_submodule_ref_store(), share common free block revision.c: --indexed-objects add objects from all worktrees revision.c: refactor add_index_objects_to_pending() refs.c: use is_dir_sep() in resolve_gitlink_ref() revision.h: new flag in struct rev_info wrt. worktree-related refs
Diffstat (limited to 'worktree.c')
1 files changed, 22 insertions, 0 deletions
diff --git a/worktree.c b/worktree.c
index c0c5a2b..8aaeea0 100644
--- a/worktree.c
+++ b/worktree.c
@@ -386,3 +386,25 @@ int submodule_uses_worktrees(const char *path)
return ret;
+int other_head_refs(each_ref_fn fn, void *cb_data)
+ struct worktree **worktrees, **p;
+ int ret = 0;
+ worktrees = get_worktrees(0);
+ for (p = worktrees; *p; p++) {
+ struct worktree *wt = *p;
+ struct ref_store *refs;
+ if (wt->is_current)
+ continue;
+ refs = get_worktree_ref_store(wt);
+ ret = refs_head_ref(refs, fn, cb_data);
+ if (ret)
+ break;
+ }
+ free_worktrees(worktrees);
+ return ret;