This is equivalent to "git init;git add .;git commit -q -m blah". I find myself doing that too many times, hence this shortcut. In future, --fast-import support would also be nice if the import directory has a lot of files. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- Documentation/git-init.txt | 17 ++++++++++++++- builtin-init-db.c | 49 ++++++++++++++++++++++++++++++++++++++++--- t/t0001-init.sh | 44 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+), 5 deletions(-) diff --git a/Documentation/git-init.txt b/Documentation/git-init.txt index 71749c0..ab75c10 100644 --- a/Documentation/git-init.txt +++ b/Documentation/git-init.txt @@ -8,7 +8,8 @@ git-init - Create an empty git repository or reinitialize an existing one SYNOPSIS -------- -'git init' [-q | --quiet] [--bare] [--template=<template_directory>] [--shared[=<permissions>]] +'git init' [-q | --quiet] [--bare] [--template=<template_directory>] + [--shared[=<permissions>]] [-m|--import [<message>]] OPTIONS @@ -68,6 +69,20 @@ By default, the configuration flag receive.denyNonFastForwards is enabled in shared repositories, so that you cannot force a non fast-forwarding push into it. +-m <message>:: +--import <message>:: + +Commit everything to the newly initialized repository. This is equivalent to: + +---------------- +$ git init +$ git add . +$ git commit -q -m <message> +---------------- + +If no message is given, "Initial commit" will be used. +This option does not work with `--bare` nor already initialized repository. + -- diff --git a/builtin-init-db.c b/builtin-init-db.c index ee3911f..3ace4ca 100644 --- a/builtin-init-db.c +++ b/builtin-init-db.c @@ -6,6 +6,7 @@ #include "cache.h" #include "builtin.h" #include "exec_cmd.h" +#include "run-command.h" #ifndef DEFAULT_GIT_TEMPLATE_DIR #define DEFAULT_GIT_TEMPLATE_DIR "/usr/share/git-core/templates" @@ -19,6 +20,7 @@ static int init_is_bare_repository = 0; static int init_shared_repository = -1; +static int reinit; static void safe_create_dir(const char *dir, int share) { @@ -279,7 +281,7 @@ int init_db(const char *template_dir, unsigned int flags) { const char *sha1_dir; char *path; - int len, reinit; + int len; safe_create_dir(get_git_dir(), 0); @@ -363,8 +365,29 @@ static int guess_repository_type(const char *git_dir) return 1; } +static int import_files(const char *import_message) +{ + const char *args[6]; + int i = 0; + int ret; + + args[i++] = "add"; + args[i++] = "."; + args[i] = NULL; + ret = run_command_v_opt(args, RUN_GIT_CMD); + if (ret) + return ret; + i = 0; + args[i++] = "commit"; + args[i++] = "-q"; + args[i++] = "-m"; + args[i++] = import_message; + args[i] = NULL; + return run_command_v_opt(args, RUN_GIT_CMD); +} + static const char init_db_usage[] = -"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared[=<permissions>]]"; +"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared[=<permissions>]] [-m|--import [<message>]]"; /* * If you want to, you can share the DB area with any number of branches. @@ -377,7 +400,8 @@ int cmd_init_db(int argc, const char **argv, const char *prefix) const char *git_dir; const char *template_dir = NULL; unsigned int flags = 0; - int i; + const char *import_message = NULL; + int ret, i; for (i = 1; i < argc; i++, argv++) { const char *arg = argv[1]; @@ -392,12 +416,24 @@ int cmd_init_db(int argc, const char **argv, const char *prefix) init_shared_repository = PERM_GROUP; else if (!prefixcmp(arg, "--shared=")) init_shared_repository = git_config_perm("arg", arg+9); + else if (!strcmp(arg, "--import") || !strcmp(arg, "-m")) { + if (i+1 >= argc) + import_message = "Initial commit"; + else { + import_message = argv[2]; + i++; + argv++; + } + } else if (!strcmp(arg, "-q") || !strcmp(arg, "--quiet")) flags |= INIT_DB_QUIET; else usage(init_db_usage); } + if (import_message && is_bare_repository_cfg == 1) + die("--import does not work with --bare"); + /* * GIT_WORK_TREE makes sense only in conjunction with GIT_DIR * without --bare. Catch the error early. @@ -440,5 +476,10 @@ int cmd_init_db(int argc, const char **argv, const char *prefix) set_git_dir(make_absolute_path(git_dir)); - return init_db(template_dir, flags); + ret = init_db(template_dir, flags); + if (ret || !import_message) + return ret; + if (reinit) + die("--import does not work with already initialized repository"); + return import_files(import_message); } diff --git a/t/t0001-init.sh b/t/t0001-init.sh index 5ac0a27..83a9e06 100755 --- a/t/t0001-init.sh +++ b/t/t0001-init.sh @@ -199,4 +199,48 @@ test_expect_success 'init honors global core.sharedRepository' ' x`git config -f shared-honor-global/.git/config core.sharedRepository` ' +test_expect_success 'init --import does not work with --bare' ' + ( + unset GIT_DIR GIT_WORK_TREE GIT_CONFIG + mkdir init-import-bare.git && + cd init-import-bare.git && + ! git init --bare --import test + ) + +' + +test_expect_success 'init --import no message' ' + ( + test_tick + unset GIT_DIR GIT_WORK_TREE GIT_CONFIG + mkdir init-import-nomsg && + cd init-import-nomsg && + touch foo bar && + git init --import && + test "$(git rev-parse HEAD)" = 4ff955458fd61a7b5d798b81e28c9249e8ebb5df + ) +' + +test_expect_success 'init --import' ' + ( + test_tick + unset GIT_DIR GIT_WORK_TREE GIT_CONFIG + mkdir init-import && + cd init-import && + touch foo bar && + git init --import test && + test "$(git rev-parse HEAD)" = 758aa5a579e42200a6fd4e4964c7e1dc1875d67d + ) +' + +test_expect_success 'init --import on already init(ed) should fail' ' + ( + test_tick + unset GIT_DIR GIT_WORK_TREE GIT_CONFIG + cd init-import && + ! git init --import testagain && + test "$(git rev-parse HEAD)" = 758aa5a579e42200a6fd4e4964c7e1dc1875d67d + ) +' + test_done -- 1.6.1.446.gc7851 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html