TEST_BUILTINS_OBJS += test-read-cache.o
 TEST_BUILTINS_OBJS += test-ref-store.o
 TEST_BUILTINS_OBJS += test-regex.o
+TEST_BUILTINS_OBJS += test-repository.o
 TEST_BUILTINS_OBJS += test-revision-walking.o
 TEST_BUILTINS_OBJS += test-run-command.o
 TEST_BUILTINS_OBJS += test-scrap-cache-tree.o
 
 
        check_connectivity();
 
-       if (core_commit_graph) {
+       if (!git_config_get_bool("core.commitgraph", &i) && i) {
                struct child_process commit_graph_verify = CHILD_PROCESS_INIT;
                const char *verify_argv[] = { "commit-graph", "verify", NULL, NULL, NULL };
 
 
 
 extern int fsync_object_files;
 extern int core_preload_index;
-extern int core_commit_graph;
 extern int core_apply_sparse_checkout;
 extern int precomposed_unicode;
 extern int protect_hfs;
 
        exit(1);
 }
 
-static void prepare_commit_graph_one(const char *obj_dir)
+static void prepare_commit_graph_one(struct repository *r, const char *obj_dir)
 {
        char *graph_name;
 
-       if (the_repository->objects->commit_graph)
+       if (r->objects->commit_graph)
                return;
 
        graph_name = get_commit_graph_filename(obj_dir);
-       the_repository->objects->commit_graph =
+       r->objects->commit_graph =
                load_commit_graph_one(graph_name);
 
        FREE_AND_NULL(graph_name);
  * On the first invocation, this function attemps to load the commit
  * graph if the_repository is configured to have one.
  */
-static int prepare_commit_graph(void)
+static int prepare_commit_graph(struct repository *r)
 {
        struct alternate_object_database *alt;
        char *obj_dir;
+       int config_value;
 
-       if (the_repository->objects->commit_graph_attempted)
-               return !!the_repository->objects->commit_graph;
-       the_repository->objects->commit_graph_attempted = 1;
+       if (r->objects->commit_graph_attempted)
+               return !!r->objects->commit_graph;
+       r->objects->commit_graph_attempted = 1;
 
-       if (!core_commit_graph)
+       if (repo_config_get_bool(r, "core.commitgraph", &config_value) ||
+           !config_value)
+               /*
+                * This repository is not configured to use commit graphs, so
+                * do not load one. (But report commit_graph_attempted anyway
+                * so that commit graph loading is not attempted again for this
+                * repository.)
+                */
                return 0;
 
-       obj_dir = get_object_directory();
-       prepare_commit_graph_one(obj_dir);
-       prepare_alt_odb(the_repository);
-       for (alt = the_repository->objects->alt_odb_list;
-            !the_repository->objects->commit_graph && alt;
+       obj_dir = r->objects->objectdir;
+       prepare_commit_graph_one(r, obj_dir);
+       prepare_alt_odb(r);
+       for (alt = r->objects->alt_odb_list;
+            !r->objects->commit_graph && alt;
             alt = alt->next)
-               prepare_commit_graph_one(alt->path);
-       return !!the_repository->objects->commit_graph;
+               prepare_commit_graph_one(r, alt->path);
+       return !!r->objects->commit_graph;
 }
 
 static void close_commit_graph(void)
 {
        uint32_t pos;
 
-       if (!core_commit_graph)
-               return 0;
        if (item->object.parsed)
                return 1;
 
        return 0;
 }
 
-int parse_commit_in_graph(struct commit *item)
+int parse_commit_in_graph(struct repository *r, struct commit *item)
 {
-       if (!prepare_commit_graph())
+       if (!prepare_commit_graph(r))
                return 0;
-       return parse_commit_in_graph_one(the_repository->objects->commit_graph, item);
+       return parse_commit_in_graph_one(r->objects->commit_graph, item);
 }
 
-void load_commit_graph_info(struct commit *item)
+void load_commit_graph_info(struct repository *r, struct commit *item)
 {
        uint32_t pos;
-       if (!prepare_commit_graph())
+       if (!prepare_commit_graph(r))
                return;
-       if (find_commit_in_graph(item, the_repository->objects->commit_graph, &pos))
-               fill_commit_graph_info(item, the_repository->objects->commit_graph, pos);
+       if (find_commit_in_graph(item, r->objects->commit_graph, &pos))
+               fill_commit_graph_info(item, r->objects->commit_graph, pos);
 }
 
 static struct tree *load_tree_for_commit(struct commit_graph *g, struct commit *c)
        return load_tree_for_commit(g, (struct commit *)c);
 }
 
-struct tree *get_commit_tree_in_graph(const struct commit *c)
+struct tree *get_commit_tree_in_graph(struct repository *r, const struct commit *c)
 {
-       return get_commit_tree_in_graph_one(the_repository->objects->commit_graph, c);
+       return get_commit_tree_in_graph_one(r->objects->commit_graph, c);
 }
 
 static void write_graph_chunk_fanout(struct hashfile *f,
        oids.alloc = approximate_object_count() / 4;
 
        if (append) {
-               prepare_commit_graph_one(obj_dir);
+               prepare_commit_graph_one(the_repository, obj_dir);
                if (the_repository->objects->commit_graph)
                        oids.alloc += the_repository->objects->commit_graph->num_commits;
        }
 
  *
  * See parse_commit_buffer() for the fallback after this call.
  */
-int parse_commit_in_graph(struct commit *item);
+int parse_commit_in_graph(struct repository *r, struct commit *item);
 
 /*
  * It is possible that we loaded commit contents from the commit buffer,
  * checked and filled. Fill the graph_pos and generation members of
  * the given commit.
  */
-void load_commit_graph_info(struct commit *item);
+void load_commit_graph_info(struct repository *r, struct commit *item);
 
-struct tree *get_commit_tree_in_graph(const struct commit *c);
+struct tree *get_commit_tree_in_graph(struct repository *r,
+                                     const struct commit *c);
 
 struct commit_graph {
        int graph_fd;
 
        if (commit->graph_pos == COMMIT_NOT_FROM_GRAPH)
                BUG("commit has NULL tree, but was not loaded from commit-graph");
 
-       return get_commit_tree_in_graph(commit);
+       return get_commit_tree_in_graph(the_repository, commit);
 }
 
 struct object_id *get_commit_tree_oid(const struct commit *commit)
        item->date = parse_commit_date(bufptr, tail);
 
        if (check_graph)
-               load_commit_graph_info(item);
+               load_commit_graph_info(the_repository, item);
 
        return 0;
 }
                return -1;
        if (item->object.parsed)
                return 0;
-       if (use_commit_graph && parse_commit_in_graph(item))
+       if (use_commit_graph && parse_commit_in_graph(the_repository, item))
                return 0;
        buffer = read_object_file(&item->object.oid, &type, &size);
        if (!buffer)
 
                return 0;
        }
 
-       if (!strcmp(var, "core.commitgraph")) {
-               core_commit_graph = git_config_bool(var, value);
-               return 0;
-       }
-
        if (!strcmp(var, "core.sparsecheckout")) {
                core_apply_sparse_checkout = git_config_bool(var, value);
                return 0;
 
 enum object_creation_mode object_creation_mode = OBJECT_CREATION_MODE;
 char *notes_ref_name;
 int grafts_replace_parents = 1;
-int core_commit_graph;
 int core_apply_sparse_checkout;
 int merge_log_config = -1;
 int precomposed_unicode = -1; /* see probe_utf8_pathname_composition() */
 
 
        for (p = want; p; p = p->next) {
                struct commit *c = p->item;
-               load_commit_graph_info(c);
+               load_commit_graph_info(the_repository, c);
                if (c->generation < cutoff)
                        cutoff = c->generation;
        }
 
--- /dev/null
+#include "test-tool.h"
+#include "cache.h"
+#include "commit-graph.h"
+#include "commit.h"
+#include "config.h"
+#include "object-store.h"
+#include "object.h"
+#include "repository.h"
+#include "tree.h"
+
+static void test_parse_commit_in_graph(const char *gitdir, const char *worktree,
+                                      const struct object_id *commit_oid)
+{
+       struct repository r;
+       struct commit *c;
+       struct commit_list *parent;
+
+       repo_init(&r, gitdir, worktree);
+
+       c = lookup_commit(&r, commit_oid);
+
+       if (!parse_commit_in_graph(&r, c))
+               die("Couldn't parse commit");
+
+       printf("%"PRItime, c->date);
+       for (parent = c->parents; parent; parent = parent->next)
+               printf(" %s", oid_to_hex(&parent->item->object.oid));
+       printf("\n");
+
+       repo_clear(&r);
+}
+
+static void test_get_commit_tree_in_graph(const char *gitdir,
+                                         const char *worktree,
+                                         const struct object_id *commit_oid)
+{
+       struct repository r;
+       struct commit *c;
+       struct tree *tree;
+
+       repo_init(&r, gitdir, worktree);
+
+       c = lookup_commit(&r, commit_oid);
+
+       /*
+        * get_commit_tree_in_graph does not automatically parse the commit, so
+        * parse it first.
+        */
+       if (!parse_commit_in_graph(&r, c))
+               die("Couldn't parse commit");
+       tree = get_commit_tree_in_graph(&r, c);
+       if (!tree)
+               die("Couldn't get commit tree");
+
+       printf("%s\n", oid_to_hex(&tree->object.oid));
+
+       repo_clear(&r);
+}
+
+int cmd__repository(int argc, const char **argv)
+{
+       if (argc < 2)
+               die("must have at least 2 arguments");
+       if (!strcmp(argv[1], "parse_commit_in_graph")) {
+               struct object_id oid;
+               if (argc < 5)
+                       die("not enough arguments");
+               if (parse_oid_hex(argv[4], &oid, &argv[4]))
+                       die("cannot parse oid '%s'", argv[4]);
+               test_parse_commit_in_graph(argv[2], argv[3], &oid);
+       } else if (!strcmp(argv[1], "get_commit_tree_in_graph")) {
+               struct object_id oid;
+               if (argc < 5)
+                       die("not enough arguments");
+               if (parse_oid_hex(argv[4], &oid, &argv[4]))
+                       die("cannot parse oid '%s'", argv[4]);
+               test_get_commit_tree_in_graph(argv[2], argv[3], &oid);
+       } else {
+               die("unrecognized '%s'", argv[1]);
+       }
+       return 0;
+}
 
        { "read-cache", cmd__read_cache },
        { "ref-store", cmd__ref_store },
        { "regex", cmd__regex },
+       { "repository", cmd__repository },
        { "revision-walking", cmd__revision_walking },
        { "run-command", cmd__run_command },
        { "scrap-cache-tree", cmd__scrap_cache_tree },
 
 int cmd__read_cache(int argc, const char **argv);
 int cmd__ref_store(int argc, const char **argv);
 int cmd__regex(int argc, const char **argv);
+int cmd__repository(int argc, const char **argv);
 int cmd__revision_walking(int argc, const char **argv);
 int cmd__run_command(int argc, const char **argv);
 int cmd__scrap_cache_tree(int argc, const char **argv);
 
        test_must_fail git fsck
 '
 
+test_expect_success 'setup non-the_repository tests' '
+       rm -rf repo &&
+       git init repo &&
+       test_commit -C repo one &&
+       test_commit -C repo two &&
+       git -C repo config core.commitGraph true &&
+       git -C repo rev-parse two | \
+               git -C repo commit-graph write --stdin-commits
+'
+
+test_expect_success 'parse_commit_in_graph works for non-the_repository' '
+       test-tool repository parse_commit_in_graph \
+               repo/.git repo "$(git -C repo rev-parse two)" >actual &&
+       echo $(git -C repo log --pretty="%ct" -1) \
+               $(git -C repo rev-parse one) >expect &&
+       test_cmp expect actual &&
+
+       test-tool repository parse_commit_in_graph \
+               repo/.git repo "$(git -C repo rev-parse one)" >actual &&
+       echo $(git -C repo log --pretty="%ct" -1 one) >expect &&
+       test_cmp expect actual
+'
+
+test_expect_success 'get_commit_tree_in_graph works for non-the_repository' '
+       test-tool repository get_commit_tree_in_graph \
+               repo/.git repo "$(git -C repo rev-parse two)" >actual &&
+       echo $(git -C repo rev-parse two^{tree}) >expect &&
+       test_cmp expect actual &&
+
+       test-tool repository get_commit_tree_in_graph \
+               repo/.git repo "$(git -C repo rev-parse one)" >actual &&
+       echo $(git -C repo rev-parse one^{tree}) >expect &&
+       test_cmp expect actual
+'
+
 test_done