git-cherry-pick: add allow-empty option
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 operation. Signed-off-by: Neil Horman <nhorman@tuxdriver.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
e8dde3e5f9
commit
df478b744c
@ -103,6 +103,15 @@ effect to your index in a row.
|
|||||||
cherry-pick'ed commit, then a fast forward to this commit will
|
cherry-pick'ed commit, then a fast forward to this commit will
|
||||||
be performed.
|
be performed.
|
||||||
|
|
||||||
|
--allow-empty::
|
||||||
|
By default, cherry-picking an empty commit will fail,
|
||||||
|
indicating that an explicit invocation of `git commit
|
||||||
|
--allow-empty` is required. This option overrides that
|
||||||
|
behavior, allowing empty commits to be preserved automatically
|
||||||
|
in a cherry-pick. Note that when "--ff" is in effect, empty
|
||||||
|
commits that meet the "fast-forward" requirement will be kept
|
||||||
|
even without this option.
|
||||||
|
|
||||||
--strategy=<strategy>::
|
--strategy=<strategy>::
|
||||||
Use the given merge strategy. Should only be used once.
|
Use the given merge strategy. Should only be used once.
|
||||||
See the MERGE STRATEGIES section in linkgit:git-merge[1]
|
See the MERGE STRATEGIES section in linkgit:git-merge[1]
|
||||||
|
@ -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(),
|
||||||
OPT_END(),
|
OPT_END(),
|
||||||
|
OPT_END(),
|
||||||
};
|
};
|
||||||
|
|
||||||
if (opts->action == REPLAY_PICK) {
|
if (opts->action == REPLAY_PICK) {
|
||||||
struct option cp_extra[] = {
|
struct option cp_extra[] = {
|
||||||
OPT_BOOLEAN('x', NULL, &opts->record_origin, "append commit name"),
|
OPT_BOOLEAN('x', NULL, &opts->record_origin, "append commit name"),
|
||||||
OPT_BOOLEAN(0, "ff", &opts->allow_ff, "allow fast-forward"),
|
OPT_BOOLEAN(0, "ff", &opts->allow_ff, "allow fast-forward"),
|
||||||
|
OPT_BOOLEAN(0, "allow-empty", &opts->allow_empty, "preserve empty commits"),
|
||||||
OPT_END(),
|
OPT_END(),
|
||||||
};
|
};
|
||||||
if (parse_options_concat(options, ARRAY_SIZE(options), cp_extra))
|
if (parse_options_concat(options, ARRAY_SIZE(options), cp_extra))
|
||||||
|
@ -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)
|
static int run_git_commit(const char *defmsg, struct replay_opts *opts)
|
||||||
{
|
{
|
||||||
/* 6 is max possible length of our args array including NULL */
|
/* 7 is max possible length of our args array including NULL */
|
||||||
const char *args[6];
|
const char *args[7];
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
args[i++] = "commit";
|
args[i++] = "commit";
|
||||||
@ -272,6 +272,9 @@ static int run_git_commit(const char *defmsg, struct replay_opts *opts)
|
|||||||
args[i++] = "-F";
|
args[i++] = "-F";
|
||||||
args[i++] = defmsg;
|
args[i++] = defmsg;
|
||||||
}
|
}
|
||||||
|
if (opts->allow_empty)
|
||||||
|
args[i++] = "--allow-empty";
|
||||||
|
|
||||||
args[i] = NULL;
|
args[i] = NULL;
|
||||||
|
|
||||||
return run_command_v_opt(args, RUN_GIT_CMD);
|
return run_command_v_opt(args, RUN_GIT_CMD);
|
||||||
|
@ -29,6 +29,7 @@ struct replay_opts {
|
|||||||
int signoff;
|
int signoff;
|
||||||
int allow_ff;
|
int allow_ff;
|
||||||
int allow_rerere_auto;
|
int allow_rerere_auto;
|
||||||
|
int allow_empty;
|
||||||
|
|
||||||
int mainline;
|
int mainline;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user