Skip to content

Commit 7555567

Browse files
bk2204gitster
authored andcommitted
builtin/init-db: handle bare clones when core.bare set to false
In 552955e ("clone: use more conventional config/option layering", 2020-10-01), clone learned to read configuration options earlier in its execution, before creating the new repository. However, that led to a problem: if the core.bare setting is set to false in the global config, cloning a bare repository segfaults. This happens because the repository is falsely thought to be non-bare, but clone has set the work tree to NULL, which is then dereferenced. The code to initialize the repository already considers the fact that a user might want to override the --bare option for git init, but it doesn't take into account clone, which uses a different option. Let's just check that the work tree is not NULL, since that's how clone indicates that the repository is bare. This is also the case for git init, so we won't be regressing that case. Reported-by: Joseph Vusich <[email protected]> Signed-off-by: brian m. carlson <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 71ca53e commit 7555567

File tree

2 files changed

+10
-2
lines changed

2 files changed

+10
-2
lines changed

builtin/init-db.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ static int create_default_files(const char *template_path,
212212
int reinit;
213213
int filemode;
214214
struct strbuf err = STRBUF_INIT;
215+
const char *work_tree = get_git_work_tree();
215216

216217
/* Just look for `init.templatedir` */
217218
init_db_template_dir = NULL; /* re-set in case it was set before */
@@ -235,7 +236,7 @@ static int create_default_files(const char *template_path,
235236
* We must make sure command-line options continue to override any
236237
* values we might have just re-read from the config.
237238
*/
238-
is_bare_repository_cfg = init_is_bare_repository;
239+
is_bare_repository_cfg = init_is_bare_repository || !work_tree;
239240
if (init_shared_repository != -1)
240241
set_shared_repository(init_shared_repository);
241242

@@ -299,7 +300,6 @@ static int create_default_files(const char *template_path,
299300
if (is_bare_repository())
300301
git_config_set("core.bare", "true");
301302
else {
302-
const char *work_tree = get_git_work_tree();
303303
git_config_set("core.bare", "false");
304304
/* allow template config file to override the default */
305305
if (log_all_ref_updates == LOG_REFS_UNSET)

t/t5606-clone-options.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,14 @@ test_expect_success 'redirected clone -v does show progress' '
101101
102102
'
103103

104+
test_expect_success 'clone does not segfault with --bare and core.bare=false' '
105+
test_config_global core.bare false &&
106+
git clone --bare parent clone-bare &&
107+
echo true >expect &&
108+
git -C clone-bare rev-parse --is-bare-repository >actual &&
109+
test_cmp expect actual
110+
'
111+
104112
test_expect_success 'chooses correct default initial branch name' '
105113
git init --bare empty &&
106114
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \

0 commit comments

Comments
 (0)