Skip to content

Commit

Permalink
commit: fix "--amend --only" with no pathspec
Browse files Browse the repository at this point in the history
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>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Jul 10, 2012
1 parent cbcab75 commit ea2d4ed
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 1 deletion.
5 changes: 4 additions & 1 deletion builtin-commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,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);
Expand Down Expand Up @@ -324,7 +327,7 @@ static char *prepare_index(int argc, const char **argv, const char *prefix, int
* hooks on the real index, 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 (write_cache(fd, active_cache, active_nr) ||
Expand Down
10 changes: 10 additions & 0 deletions t/t7501-commit.sh
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,16 @@ test_expect_success \
"amend commit" \
"EDITOR=./editor git commit --amend"

test_expect_success 'amend --only ignores staged contents' '
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 &&
git diff --exit-code
'

test_expect_success \
"passing -m and -F" \
"echo 'enough with the bongos' >file && \
Expand Down

0 comments on commit ea2d4ed

Please sign in to comment.