aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2012-07-10 16:40:29 -0400
committerJunio C Hamano <gitster@pobox.com>2012-07-10 14:16:41 -0700
commitea2d4ed35902ce15959965ab86d80527731a177c (patch)
tree4512fb08e9c98c699f40e59a1fbbe8002ce54ea1
parentcbcab75c54b5956dcaa4f24a4074bc99adc49629 (diff)
downloadgit-ea2d4ed35902ce15959965ab86d80527731a177c.tar.gz
git-ea2d4ed35902ce15959965ab86d80527731a177c.tar.xz
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> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--builtin-commit.c5
-rwxr-xr-xt/t7501-commit.sh10
2 files changed, 14 insertions, 1 deletions
diff --git a/builtin-commit.c b/builtin-commit.c
index f4c73442c..b34fb0374 100644
--- a/builtin-commit.c
+++ b/builtin-commit.c
@@ -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);
@@ -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) ||
diff --git a/t/t7501-commit.sh b/t/t7501-commit.sh
index 7940901d4..e1181f097 100755
--- a/t/t7501-commit.sh
+++ b/t/t7501-commit.sh
@@ -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 && \