diff --git a/builtin/clone.c b/builtin/clone.c index d60d1b60bc..9d08cd8722 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -1116,7 +1116,6 @@ int cmd_clone(int argc, die_errno(_("could not create work tree dir '%s'"), work_tree); junk_work_tree = work_tree; - set_git_work_tree(the_repository, work_tree); } if (real_git_dir) { @@ -1186,9 +1185,10 @@ int cmd_clone(int argc, * repository, and reference backends may persist that information into * their on-disk data structures. */ - init_db(the_repository, git_dir, real_git_dir, option_template, GIT_HASH_UNKNOWN, - ref_storage_format, NULL, - do_not_override_repo_unix_permissions, INIT_DB_QUIET | INIT_DB_SKIP_REFDB); + init_db(the_repository, git_dir, real_git_dir, work_tree, option_template, + GIT_HASH_UNKNOWN, ref_storage_format, NULL, + do_not_override_repo_unix_permissions, + INIT_DB_QUIET | INIT_DB_SKIP_REFDB); if (real_git_dir) { free((char *)git_dir); diff --git a/builtin/init-db.c b/builtin/init-db.c index 566732c9f4..e96b1283b7 100644 --- a/builtin/init-db.c +++ b/builtin/init-db.c @@ -231,39 +231,25 @@ int cmd_init_db(int argc, if (!bare) { const char *git_dir_parent = strrchr(git_dir, '/'); - if (work_tree) { - set_git_work_tree(the_repository, work_tree); - } else { - char *work_tree_cfg = NULL; - + if (!work_tree) { if (git_dir_parent) { char *rel = xstrndup(git_dir, git_dir_parent - git_dir); - work_tree_cfg = real_pathdup(rel, 1); + work_tree = real_pathdup(rel, 1); free(rel); + } else { + work_tree = xgetcwd(); } - - if (!work_tree_cfg) - work_tree_cfg = xgetcwd(); - - set_git_work_tree(the_repository, work_tree_cfg); - - free(work_tree_cfg); } - if (access(repo_get_work_tree(the_repository), X_OK)) - die_errno (_("Cannot access work tree '%s'"), - repo_get_work_tree(the_repository)); - } - else { - if (real_git_dir) - die(_("--separate-git-dir incompatible with bare repository")); - if (work_tree) - set_git_work_tree(the_repository, work_tree); + if (access(work_tree, X_OK)) + die_errno (_("Cannot access work tree '%s'"), work_tree); + } else if (real_git_dir) { + die(_("--separate-git-dir incompatible with bare repository")); } flags |= INIT_DB_EXIST_OK; - ret = init_db(the_repository, git_dir, real_git_dir, template_dir, hash_algo, - ref_storage_format, initial_branch, + ret = init_db(the_repository, git_dir, real_git_dir, work_tree, + template_dir, hash_algo, ref_storage_format, initial_branch, init_shared_repository, flags); free(template_dir_to_free); diff --git a/setup.c b/setup.c index 088e7b85f7..683b8e65a2 100644 --- a/setup.c +++ b/setup.c @@ -2823,7 +2823,9 @@ static void repository_format_configure(struct repository_format *repo_fmt, } int init_db(struct repository *repo, - const char *git_dir, const char *real_git_dir, + const char *git_dir, + const char *real_git_dir, + const char *worktree, const char *template_dir, int hash, enum ref_storage_format ref_storage_format, const char *initial_branch, @@ -2852,6 +2854,9 @@ int init_db(struct repository *repo, git_dir = repo_get_git_dir(repo); } + if (worktree) + set_git_work_tree(repo, worktree); + /* * Check to see if the repository version is right. * Note that a newly created repository does not have diff --git a/setup.h b/setup.h index c01a244fe9..bf3e3f3ea6 100644 --- a/setup.h +++ b/setup.h @@ -263,7 +263,9 @@ const char *get_template_dir(const char *option_template); #define INIT_DB_SKIP_REFDB (1 << 2) int init_db(struct repository *repo, - const char *git_dir, const char *real_git_dir, + const char *git_dir, + const char *real_git_dir, + const char *worktree, const char *template_dir, int hash_algo, enum ref_storage_format ref_storage_format, const char *initial_branch, int init_shared_repository,