From ef0a89a604acb7fc2e3c08566641b95b23d87fd6 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Fri, 15 Dec 2006 00:44:58 -0500 Subject: Provide more meaningful output from 'git init-db'. Back in the old days of Git when people messed around with their GIT_DIR environment variable more often it was nice to know whether or not git-init-db created a .git directory or used GIT_DIR. As most users at that time were rather technical UNIXy folk the message "defaulting to local storage area" made sense to some and seemed reasonable. But it doesn't really convey any meaning to the new Git user, as they don't know what a 'local storage area is' nor do they know enough about Git to care. It also really doesn't tell the experienced Git user a whole lot about the command they just ran, especially if they might be reinitializing an existing repository (e.g. to update hooks). So now we print out what we did ("Initialized empty" or "Reinitialized existing"), what type of repository ("" or "shared"), and what location the repository will be in ("$GIT_DIR"). Suggested in part by Andy Parkins in his Git 'niggles' list (<200612132237.10051.andyparkins@gmail.com>). Signed-off-by: Shawn O. Pearce Signed-off-by: Junio C Hamano --- builtin-init-db.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'builtin-init-db.c') diff --git a/builtin-init-db.c b/builtin-init-db.c index 235a0ee48f..8f2b7500dc 100644 --- a/builtin-init-db.c +++ b/builtin-init-db.c @@ -164,13 +164,14 @@ static void copy_templates(const char *git_dir, int len, const char *template_di closedir(dir); } -static void create_default_files(const char *git_dir, const char *template_path) +static int create_default_files(const char *git_dir, const char *template_path) { unsigned len = strlen(git_dir); static char path[PATH_MAX]; unsigned char sha1[20]; struct stat st1; char repo_version_string[10]; + int reinit; if (len > sizeof(path)-50) die("insane git directory %s", git_dir); @@ -218,7 +219,8 @@ static void create_default_files(const char *git_dir, const char *template_path) * branch, if it does not exist yet. */ strcpy(path + len, "HEAD"); - if (read_ref("HEAD", sha1) < 0) { + reinit = !read_ref("HEAD", sha1); + if (!reinit) { if (create_symref("HEAD", "refs/heads/master") < 0) exit(1); } @@ -239,6 +241,8 @@ static void create_default_files(const char *git_dir, const char *template_path) git_config_set("core.filemode", filemode ? "true" : "false"); } + + return reinit; } static const char init_db_usage[] = @@ -256,7 +260,7 @@ int cmd_init_db(int argc, const char **argv, const char *prefix) const char *sha1_dir; const char *template_dir = NULL; char *path; - int len, i; + int len, i, reinit; for (i = 1; i < argc; i++, argv++) { const char *arg = argv[1]; @@ -274,10 +278,8 @@ int cmd_init_db(int argc, const char **argv, const char *prefix) * Set up the default .git directory contents */ git_dir = getenv(GIT_DIR_ENVIRONMENT); - if (!git_dir) { + if (!git_dir) git_dir = DEFAULT_GIT_DIR_ENVIRONMENT; - fprintf(stderr, "defaulting to local storage area\n"); - } safe_create_dir(git_dir, 0); /* Check to see if the repository version is right. @@ -287,7 +289,7 @@ int cmd_init_db(int argc, const char **argv, const char *prefix) */ check_repository_format(); - create_default_files(git_dir, template_dir); + reinit = create_default_files(git_dir, template_dir); /* * And set up the object store. @@ -314,5 +316,10 @@ int cmd_init_db(int argc, const char **argv, const char *prefix) git_config_set("receive.denyNonFastforwards", "true"); } + printf("%s%s Git repository in %s/\n", + reinit ? "Reinitialized existing" : "Initialized empty", + shared_repository ? " shared" : "", + git_dir); + return 0; } -- cgit v1.2.1 From 0bee59186976b1d9e6b2dd77332480c9480131d5 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Thu, 14 Dec 2006 17:41:17 -0500 Subject: Enable reflogs by default in any repository with a working directory. New and experienced Git users alike are finding out too late that they forgot to enable reflogs in the current repository, and cannot use the information stored within it to recover from an incorrectly entered command such as `git reset --hard HEAD^^^` when they really meant HEAD^^ (aka HEAD~2). So enable reflogs by default in all future versions of Git, unless the user specifically disables it with: [core] logAllRefUpdates = false in their .git/config or ~/.gitconfig. We only enable reflogs in repositories that have a working directory associated with them, as shared/bare repositories do not have an easy means to prune away old log entries, or may fail logging entirely if the user's gecos information is not valid during a push. This heuristic was suggested on the mailing list by Junio. Documentation was also updated to indicate the new default behavior. We probably should start to teach usuing the reflog to recover from mistakes in some of the tutorial material, as new users are likely to make a few along the way and will feel better knowing they can recover from them quickly and easily, without fsck-objects' lost+found features. Signed-off-by: Shawn O. Pearce Signed-off-by: Junio C Hamano --- builtin-init-db.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'builtin-init-db.c') diff --git a/builtin-init-db.c b/builtin-init-db.c index 8f2b7500dc..1d7d15e8d5 100644 --- a/builtin-init-db.c +++ b/builtin-init-db.c @@ -242,6 +242,9 @@ static int create_default_files(const char *git_dir, const char *template_path) filemode ? "true" : "false"); } + /* Enable logAllRefUpdates if a working tree is attached */ + if (!is_bare_git_dir(git_dir)) + git_config_set("core.logallrefupdates", "true"); return reinit; } -- cgit v1.2.1 From 8683a45d66967b0969516a2b72cdbf136c2064a2 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Tue, 19 Dec 2006 09:18:09 +0100 Subject: Introduce GIT_TEMPLATE_DIR Instead of passing --template explicitely to init-db and clone, you can just set the environment variable GIT_TEMPLATE_DIR. Also make use of it in the tests, to make sure that the templates are copied. Signed-off-by: Johannes Schindelin Signed-off-by: Junio C Hamano --- builtin-init-db.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'builtin-init-db.c') diff --git a/builtin-init-db.c b/builtin-init-db.c index 1d7d15e8d5..c8ed5c2a0b 100644 --- a/builtin-init-db.c +++ b/builtin-init-db.c @@ -124,8 +124,11 @@ static void copy_templates(const char *git_dir, int len, const char *template_di int template_len; DIR *dir; - if (!template_dir) - template_dir = DEFAULT_GIT_TEMPLATE_DIR; + if (!template_dir) { + template_dir = getenv("GIT_TEMPLATE_DIR"); + if (!template_dir) + template_dir = DEFAULT_GIT_TEMPLATE_DIR; + } strcpy(template_path, template_dir); template_len = strlen(template_path); if (template_path[template_len-1] != '/') { -- cgit v1.2.1 From d4ebc36c5ee964592303c59260417b758d024c31 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Tue, 19 Dec 2006 01:28:15 -0800 Subject: Use preprocessor constants for environment variable names. We broke the discipline Linus set up to allow compiler help us avoid typos in environment names in the early days of git over time. This defines a handful preprocessor constants for environment variable names used in relatively core parts of the system. I've left out variable names specific to subsystems such as HTTP and SSL as I do not think they are big problems. Signed-off-by: Junio C Hamano --- builtin-init-db.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'builtin-init-db.c') diff --git a/builtin-init-db.c b/builtin-init-db.c index c8ed5c2a0b..01f366ad0b 100644 --- a/builtin-init-db.c +++ b/builtin-init-db.c @@ -125,7 +125,7 @@ static void copy_templates(const char *git_dir, int len, const char *template_di DIR *dir; if (!template_dir) { - template_dir = getenv("GIT_TEMPLATE_DIR"); + template_dir = getenv(TEMPLATE_DIR_ENVIRONMENT); if (!template_dir) template_dir = DEFAULT_GIT_TEMPLATE_DIR; } -- cgit v1.2.1