commit: make --only --allow-empty work without paths

--only is implied when paths are present, and required
them unless --amend. But with --allow-empty it should
be allowed as well - it is the only way to create an
empty commit in the presence of staged changes.

Signed-off-by: Andreas Krey <a.krey@gmx.de>
Reviewed-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Andreas Krey 2016-12-02 23:15:13 +01:00 committed by Junio C Hamano
parent 0202c411ed
commit 319d835240
3 changed files with 12 additions and 2 deletions

View file

@ -263,7 +263,8 @@ FROM UPSTREAM REBASE" section in linkgit:git-rebase[1].)
If this option is specified together with `--amend`, then
no paths need to be specified, which can be used to amend
the last commit without committing changes that have
already been staged.
already been staged. If used together with `--allow-empty`
paths are also not required, and an empty commit will be created.
-u[<mode>]::
--untracked-files[=<mode>]::

View file

@ -1201,7 +1201,7 @@ static int parse_and_validate_options(int argc, const char *argv[],
if (also + only + all + interactive > 1)
die(_("Only one of --include/--only/--all/--interactive/--patch can be used."));
if (argc == 0 && (also || (only && !amend)))
if (argc == 0 && (also || (only && !amend && !allow_empty)))
die(_("No paths with --include/--only does not make sense."));
if (argc == 0 && only && amend)
only_include_assumed = _("Clever... amending the last one with dirty index.");

View file

@ -155,6 +155,15 @@ test_expect_success 'amend --only ignores staged contents' '
git diff --exit-code
'
test_expect_success 'allow-empty --only ignores staged contents' '
echo changed-again >file &&
git add file &&
git commit --allow-empty --only -m "empty" &&
git cat-file blob HEAD:file >file.actual &&
test_cmp file.expect file.actual &&
git diff --exit-code
'
test_expect_success 'set up editor' '
cat >editor <<-\EOF &&
#!/bin/sh