In preceding commits the test suite has been taught to run without a template directory, but in doing so we needed to fix code that relied on the "hooks" and "branches" directories. The "hooks" code was all specific to our own test suite. The "branches" directory is intentionally created, but has been "slightly deprecated" for a while, so it's not created when not using the default template. However "info" is different. Trying to omit its creation would lead to a lot of test suite failures. Many of these we should arguably fix, the common pattern being to add an exclude to "info/excludes". But we've also grown a hard dependency on this directory within git itself. Since 94c0956b609 (sparse-checkout: create builtin with 'list' subcommand, 2019-11-21) released with v2.25.0 the "git sparse-checkout" command has wanted to add exclusions to "info/sparse-checkout". It didn't check or create the leading directory, so if it's omitted the command will die. Even if that behavior were fixed we'd be left with older versions of "git" dying if that was attempted if they used a repository initialized without a template. So let's just bite the bullet and make the "info" directory mandatory, and document it as such. Let's also note that in the documentation that this doesn't apply to the "hooks" and "branches" directories. Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> --- Documentation/gitrepository-layout.txt | 17 ++++++++++++++++- builtin/init-db.c | 6 ++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/Documentation/gitrepository-layout.txt b/Documentation/gitrepository-layout.txt index 1a2ef4c1505..eb58ab08817 100644 --- a/Documentation/gitrepository-layout.txt +++ b/Documentation/gitrepository-layout.txt @@ -160,7 +160,10 @@ branches:: and not likely to be found in modern repositories. This directory is ignored if $GIT_COMMON_DIR is set and "$GIT_COMMON_DIR/branches" will be used instead. - ++ +This directory is created by the default linkgit:git-init[1] +template. It will not be created when using a custom template that +doesn't contain it. hooks:: Hooks are customization scripts used by various Git @@ -171,6 +174,10 @@ hooks:: Read linkgit:githooks[5] for more details about each hook. This directory is ignored if $GIT_COMMON_DIR is set and "$GIT_COMMON_DIR/hooks" will be used instead. ++ +This directory is created by the default linkgit:git-init[1] +template. It will not be created when using a custom template that +doesn't contain it. common:: When multiple working trees are used, most of files in @@ -190,6 +197,14 @@ info:: Additional information about the repository is recorded in this directory. This directory is ignored if $GIT_COMMON_DIR is set and "$GIT_COMMON_DIR/info" will be used instead. ++ +This directory is created by the default linkgit:git-init[1] +template. ++ +It will be created even when when using a custom template that doesn't +contain it. On older versions of git this was not the case, as various +tools came to rely on its creation (including parts of git itself) +it's now unconditionally (re-)created on 'git init'. info/refs:: This file helps dumb transports discover what refs are diff --git a/builtin/init-db.c b/builtin/init-db.c index 3cf834eddd2..75495c9c8c6 100644 --- a/builtin/init-db.c +++ b/builtin/init-db.c @@ -222,6 +222,12 @@ static int create_default_files(const char *original_git_dir, struct strbuf err = STRBUF_INIT; const char *work_tree = get_git_work_tree(); + /* + * We may not have a info/ if the template explicitly omitted + * it. + */ + safe_create_dir(git_path("info"), 1); + /* * We must make sure command-line options continue to override any * values we might have just re-read from the config. -- 2.34.1.1020.gb1392dd1877