git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jeff King <peff@peff.net>
To: Junio C Hamano <gitster@pobox.com>
Cc: Marc Strapetz <marc.strapetz@syntevo.com>, git@vger.kernel.org
Subject: Re: "git commit --amend --only --" nevertheless commits staged changes
Date: Tue, 10 Jul 2012 16:40:29 -0400	[thread overview]
Message-ID: <20120710204028.GC23798@sigill.intra.peff.net> (raw)
In-Reply-To: <20120710203052.GB23798@sigill.intra.peff.net>

On Tue, Jul 10, 2012 at 04:30:52PM -0400, Jeff King wrote:

> On Tue, Jul 10, 2012 at 01:14:32PM -0700, Junio C Hamano wrote:
> 
> > I do not think the combination with --amend, --only and no paths
> > ever worked.  We rejected such a combination before 6a74642c5, which
> > merely made us to accept the combination but I do not think the
> > commit did anything to re-read the tree from the HEAD being amended
> > to the index.
> > 
> > Something like this, but I haven't thought about what other things
> > it may break.
> 
> Our emails just crossed. I came to the exact same conclusion, and just
> wrote almost the exact same patch.

Here it is with a test and commit message. I believe this fix could also
make:

  git commit --allow-empty --only --

work if we removed the "--only does not make sense without paths" check.
But I seriously doubt that anybody cares, given that "--only" is the
default (i.e., just omitting it already does what you want there,
whether you have pathspecs or not).

-- >8 --
Subject: [PATCH] commit: fix "--amend --only" with no pathspec

When we do not have any pathspec, we typically disallow an
explicit "--only", because it makes no sense (your commit
would, by definition, be empty). But since 6a74642
(git-commit --amend: two fixes., 2006-04-20), we have
allowed "--amend --only" with the intent that it would amend
the commit, ignoring any contents staged in the index.

However, while that commit allowed the combination, we never
actually implemented the logic to make it work. The current
code notices that we have no pathspec and assumes we want to
do an as-is commit (i.e., the "--only" is ignored).

Instead, we must make sure to follow the partial-commit
code-path. We also need to tweak the list_paths function to
handle a NULL pathspec.

Signed-off-by: Jeff King <peff@peff.net>
---
 builtin/commit.c  |  5 ++++-
 t/t7501-commit.sh | 10 ++++++++++
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/builtin/commit.c b/builtin/commit.c
index f43eaaf..3c3385c 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -184,6 +184,9 @@ static int list_paths(struct string_list *list, const char *with_tree,
 	int i;
 	char *m;
 
+	if (!pattern)
+		return 0;
+
 	for (i = 0; pattern[i]; i++)
 		;
 	m = xcalloc(1, i);
@@ -345,7 +348,7 @@ static char *prepare_index(int argc, const char **argv, const char *prefix,
 	 * and create commit from the_index.
 	 * We still need to refresh the index here.
 	 */
-	if (!pathspec || !*pathspec) {
+	if (!only && (!pathspec || !*pathspec)) {
 		fd = hold_locked_index(&index_lock, 1);
 		refresh_cache_or_die(refresh_flags);
 		if (active_cache_changed) {
diff --git a/t/t7501-commit.sh b/t/t7501-commit.sh
index b20ca0e..9f8d423 100755
--- a/t/t7501-commit.sh
+++ b/t/t7501-commit.sh
@@ -108,6 +108,16 @@ test_expect_success 'amend commit' '
 	EDITOR=./editor git commit --amend
 '
 
+test_expect_success 'amend --only ignores staged contents' '
+	test_when_finished "git reset --hard" &&
+	cp file file.expect &&
+	echo changed >file &&
+	git add file &&
+	git commit --no-edit --amend --only &&
+	git cat-file blob HEAD:file >file.actual &&
+	test_cmp file.expect file.actual
+'
+
 test_expect_success 'set up editor' '
 	cat >editor <<-\EOF &&
 	#!/bin/sh
-- 
1.7.11.35.gbaf554e.dirty

      reply	other threads:[~2012-07-10 20:40 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-10 10:41 "git commit --amend --only --" nevertheless commits staged changes Marc Strapetz
2012-07-10 20:11 ` Jeff King
2012-07-10 20:14 ` Junio C Hamano
2012-07-10 20:30   ` Jeff King
2012-07-10 20:40     ` Jeff King [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120710204028.GC23798@sigill.intra.peff.net \
    --to=peff@peff.net \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=marc.strapetz@syntevo.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).