提交 84ccad8d 编写于 作者: J Jeff King 提交者: Junio C Hamano

init: don't set core.worktree when initializing /.git

If you create a git repository in the root directory with
"git init /", we erroneously write a core.worktree entry.
This isn't _wrong_, in the sense that it's OK to set
core.worktree when we don't need to. But it is unnecessarily
surprising if you later move the .git directory to another
path (which usually moves the relative working tree, but is
foiled if there is an explicit worktree set).

The problem is that we check whether core.worktree is
necessary by seeing if we can make the git_dir by
concatenating "/.git" onto the working tree. That would lead
to "//.git" in this instance, but we actually have "/.git"
(without the doubled slash).

We can fix this by special-casing the root directory. I also
split the logic out into its own function to make the
conditional a bit more readable (and used skip_prefix, which
I think makes it a little more obvious what is going on).

No tests, as we would need to be able to write to "/" to do
so. I did manually confirm that:

  sudo git init /
  cd /
  git rev-parse --show-toplevel
  git config core.worktree

still finds the top-level correctly (as "/"), and does not
set any core.worktree variable.
Signed-off-by: NJeff King <peff@peff.net>
Reviewed-by: NJonathan Nieder <jrnieder@gmail.com>
Signed-off-by: NJunio C Hamano <gitster@pobox.com>
上级 282616c7
...@@ -177,6 +177,20 @@ static int git_init_db_config(const char *k, const char *v, void *cb) ...@@ -177,6 +177,20 @@ static int git_init_db_config(const char *k, const char *v, void *cb)
return 0; return 0;
} }
/*
* If the git_dir is not directly inside the working tree, then git will not
* find it by default, and we need to set the worktree explicitly.
*/
static int needs_work_tree_config(const char *git_dir, const char *work_tree)
{
if (!strcmp(work_tree, "/") && !strcmp(git_dir, "/.git"))
return 0;
if (skip_prefix(git_dir, work_tree, &git_dir) &&
!strcmp(git_dir, "/.git"))
return 0;
return 1;
}
static int create_default_files(const char *template_path) static int create_default_files(const char *template_path)
{ {
const char *git_dir = get_git_dir(); const char *git_dir = get_git_dir();
...@@ -266,10 +280,8 @@ static int create_default_files(const char *template_path) ...@@ -266,10 +280,8 @@ static int create_default_files(const char *template_path)
/* allow template config file to override the default */ /* allow template config file to override the default */
if (log_all_ref_updates == -1) if (log_all_ref_updates == -1)
git_config_set("core.logallrefupdates", "true"); git_config_set("core.logallrefupdates", "true");
if (!starts_with(git_dir, work_tree) || if (needs_work_tree_config(git_dir, work_tree))
strcmp(git_dir + strlen(work_tree), "/.git")) {
git_config_set("core.worktree", work_tree); git_config_set("core.worktree", work_tree);
}
} }
if (!reinit) { if (!reinit) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册