[PATCH 1/4] git-cherry-pick: add keep-empty option
From: Neil Horman <nhorman@tuxdriver.com>
Date: 2016-06-15 22:53:26
Subsystem:
documentation, the rest · Maintainers:
Jonathan Corbet, Linus Torvalds
git cherry-pick fails when picking a non-ff commit that is empty. The advice given with the failure is that a git-commit --allow-empty should be issued to explicitly add the empty commit during the cherry pick. This option allows a user to specify before hand that they want to keep the empty commit. This eliminates the need to issue both a cherry pick and a commit operaion. Signed-off-by: Neil Horman <nhorman@tuxdriver.com> CC: Jeff King <redacted> CC: Phil Hord <redacted> CC: Junio C Hamano <redacted> --- Documentation/git-cherry-pick.txt | 7 +++++++ builtin/revert.c | 2 ++ sequencer.c | 7 +++++-- sequencer.h | 1 + 4 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/Documentation/git-cherry-pick.txt b/Documentation/git-cherry-pick.txt
index fed5097..3e975dc 100644
--- a/Documentation/git-cherry-pick.txt
+++ b/Documentation/git-cherry-pick.txt@@ -103,6 +103,13 @@ effect to your index in a row. cherry-pick'ed commit, then a fast forward to this commit will be performed. +--keep-empty: + If a commit is not a fast forward, or if fast forwarding is not allowed, + cherry-picking an empty commit will fail, indicating that an explicit + invokation of git commit --allow-empty is required. This option + overrides that behavior, allowing empty commits to be preserved + automatically in a cherry-pick + --strategy=<strategy>:: Use the given merge strategy. Should only be used once. See the MERGE STRATEGIES section in linkgit:git-merge[1]
diff --git a/builtin/revert.c b/builtin/revert.c
index e6840f2..47d5522 100644
--- a/builtin/revert.c
+++ b/builtin/revert.c@@ -114,12 +114,14 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts) OPT_END(), OPT_END(), OPT_END(), + OPT_END(), }; if (opts->action == REPLAY_PICK) { struct option cp_extra[] = { OPT_BOOLEAN('x', NULL, &opts->record_origin, "append commit name"), OPT_BOOLEAN(0, "ff", &opts->allow_ff, "allow fast-forward"), + OPT_BOOLEAN(0, "keep-empty", &opts->allow_empty, "preserve empty commits"), OPT_END(), }; if (parse_options_concat(options, ARRAY_SIZE(options), cp_extra))
diff --git a/sequencer.c b/sequencer.c
index a37846a..71929ba 100644
--- a/sequencer.c
+++ b/sequencer.c@@ -260,8 +260,8 @@ static int do_recursive_merge(struct commit *base, struct commit *next, */ static int run_git_commit(const char *defmsg, struct replay_opts *opts) { - /* 6 is max possible length of our args array including NULL */ - const char *args[6]; + /* 7 is max possible length of our args array including NULL */ + const char *args[7]; int i = 0; args[i++] = "commit";
@@ -272,6 +272,9 @@ static int run_git_commit(const char *defmsg, struct replay_opts *opts) args[i++] = "-F"; args[i++] = defmsg; } + if (opts->allow_empty) + args[i++] = "--allow-empty"; + args[i] = NULL; return run_command_v_opt(args, RUN_GIT_CMD);
diff --git a/sequencer.h b/sequencer.h
index bb4b138..e2cd725 100644
--- a/sequencer.h
+++ b/sequencer.h@@ -29,6 +29,7 @@ struct replay_opts { int signoff; int allow_ff; int allow_rerere_auto; + int allow_empty; int mainline;
--
1.7.7.6