]> git.ipfire.org Git - thirdparty/git.git/commitdiff
setup: stop initializing object database without repository
authorPatrick Steinhardt <ps@pks.im>
Tue, 26 May 2026 05:57:01 +0000 (07:57 +0200)
committerJunio C Hamano <gitster@pobox.com>
Tue, 26 May 2026 11:07:02 +0000 (20:07 +0900)
The function `setup_git_directory_gently()` is responsible for
discovering and setting up a Git repository based on various environment
variables and the current working directory. The result is thus a fully
usable Git repository.

One oddity of this function is that we may set up the object database
even in the case where we don't have a repository, namely in the case
where the `GIT_DIR_EXPLICIT` environment variable is set but points to a
non-existent repository. If so, we call `setup_git_env_internal()` with
the value of the environment variable so that the repository's Git
directory is configured, even if it points to a non-existent directory.

Historically though, this function didn't only configure the repository,
but also initialized the object database. We retained this behaviour
from a preceding commit, even though it really doesn't make much sense
in the first place -- there is no repository, so we don't have an object
database either. There seemingly isn't much of a reason to construct the
object database, as we typically won't try to read objects when we don't
have an object database.

There's one exception though: git-index-pack(1) may run outside of a
repository, which can be used to perform consistency checks for a
packfile. The code path is _almost_ working: we already know to call
`parse_object_buffer()`, which can read objects without an object
database being available. And that works for all object types except for
commits, because `parse_commit_buffer()` calls `parse_commit_graph()`,
and that function doesn't handle the case where we don't have an object
database.

Fix this instance to check for the object database instead of checking
for the Git directory having been initialized. With this fixed, we can
now stop constructing an object database completely.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
commit-graph.c
setup.c

index 9abe62bd5a278af0af4838c6da75d32a82aafce1..0820cf5fb83cbe3b640e60b0893f80a5076da523 100644 (file)
@@ -740,13 +740,13 @@ static struct commit_graph *prepare_commit_graph(struct repository *r)
        struct odb_source *source;
 
        /*
-        * Early return if there is no git dir or if the commit graph is
+        * Early return if there is no object database or if the commit graph is
         * disabled.
         *
         * This must come before the "already attempted?" check below, because
         * we want to disable even an already-loaded graph file.
         */
-       if (!r->gitdir || r->commit_graph_disabled)
+       if (!r->objects || r->commit_graph_disabled)
                return NULL;
 
        if (r->objects->commit_graph_attempted)
diff --git a/setup.c b/setup.c
index 0dc9fe4565a182d2be712b295f7104fcd08a99fd..4a8d6230b18529b4881a7b7a6d4a49b6ef3de7a7 100644 (file)
--- a/setup.c
+++ b/setup.c
@@ -2043,13 +2043,12 @@ const char *setup_git_directory_gently(struct repository *repo, int *nongit_ok)
                        setup_git_env_internal(repo, gitdir);
                }
 
-               repo->objects = odb_new(repo,
-                                       getenv_safe(&to_free, DB_ENVIRONMENT),
-                                       getenv_safe(&to_free, ALTERNATE_DB_ENVIRONMENT));
-
                if (startup_info->have_repository) {
                        struct strbuf err = STRBUF_INIT;
 
+                       repo->objects = odb_new(repo,
+                                               getenv_safe(&to_free, DB_ENVIRONMENT),
+                                               getenv_safe(&to_free, ALTERNATE_DB_ENVIRONMENT));
                        if (apply_repository_format(repo, &repo_fmt, &err) < 0)
                                die("%s", err.buf);