replace-objects: evaluate replacement refs without using the object store
authorStefan Beller <>
Tue, 12 Sep 2017 17:31:40 +0000 (10:31 -0700)
committerJunio C Hamano <>
Thu, 14 Sep 2017 06:05:54 +0000 (15:05 +0900)
Pass DO_FOR_EACH_INCLUDE_BROKEN when iterating over replacement refs
so that the iteration does not require opening the named objects from
the object store. This avoids a dependency cycle between object access
and replace ref iteration.

Moreover the ref subsystem has not been migrated yet to access the
object store via passed in repository objects.  As a result, without
this patch, iterating over replace refs in a repository other than
the_repository it produces errors:

   error: refs/replace/3afabef75c627b894cccc3bcae86837abc7c32fe does not point to a valid object!

Noticed while adapting the object store (and in particular its
evaluation of replace refs) to handle arbitrary repositories.

Signed-off-by: Stefan Beller <>
Signed-off-by: Jonathan Nieder <>
Signed-off-by: Junio C Hamano <>

diff --git a/refs.c b/refs.c
index b0106b8..cd84ed9 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -1394,7 +1394,7 @@ int for_each_replace_ref(each_ref_fn fn, void *cb_data)
        return do_for_each_ref(get_main_ref_store(),
                               git_replace_ref_base, fn,
        return do_for_each_ref(get_main_ref_store(),
                               git_replace_ref_base, fn,
-                              0, cb_data);
+                              DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
 int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
 int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)