git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] Fix git rebase --continue to work with touched files

From
David D. Kilzer <ddkilzer@kilzer.net>
Date
Jul 27, 2010, 10:06 UTC
Message-ID
<1280225198-4539-1-git-send-email-ddkilzer@kilzer.net>

When performing a non-interactive rebase, sometimes "git rebase --continue" will fail if an unmodified file is touched in the working directory:

    You must edit all merge conflicts and then
    mark them as resolved using git add

This is caused by "git diff-files" reporting a difference between the index and the filesystem:

    :100644 100644 d00491...... 000000...... M	file

The fix is to run "git update-index --refresh" before "git diff-files" as is done in git-rebase--interactive.

Signed-off-by: David D. Kilzer <ddkilzer@kilzer.net>
---
The reason for the while loop in the test is that this bug only
reproduces about half of the time on my Mac Pro with Mac OS X
10.6.4.  I used 4 loops to make sure the test fails without the
fix.

I also put the test in a separate file since t3400-rebase.sh changed a lot in e877a4c, and to make it clear what is required to reproduce the bug.

 git-rebase.sh              |    1 +
 t/t3418-rebase-continue.sh |   40 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 41 insertions(+), 0 deletions(-)
 create mode 100755 t/t3418-rebase-continue.sh
diff --git a/git-rebase.sh b/git-rebase.sh
index ab4afa7..2d88742 100755
--- a/git-rebase.sh
+++ b/git-rebase.sh
@@ -208,6 +208,7 @@ do
 		test -d "$dotest" -o -d "$GIT_DIR"/rebase-apply ||
 			die "No rebase in progress?"
 
+		git update-index --ignore-submodules --refresh &&
 		git diff-files --quiet --ignore-submodules || {
 			echo "You must edit all merge conflicts and then"
 			echo "mark them as resolved using git add"
diff --git a/t/t3418-rebase-continue.sh b/t/t3418-rebase-continue.sh
new file mode 100755
index 0000000..435560c
--- /dev/null
+++ b/t/t3418-rebase-continue.sh
@@ -0,0 +1,40 @@
+#!/bin/sh
+
+test_description='git rebase --continue should work with touched files'
+
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+	echo 1 >F1 &&
+	git add F1 &&
+	git commit -m "commit: new file F1" &&
+
+	echo 2 >F2 &&
+	git add F2 &&
+	git commit -m "commit: new file F2" &&
+
+	git checkout -b topic HEAD^ &&
+
+	echo 22 > F2 &&
+	git add F2 &&
+	git commit -m "commit: new file F2 on topic branch" &&
+
+	git checkout master
+'
+
+
+test_expect_success 'rebase --continue works with touched file' '
+	count=1
+	while test "$count" -le 4
+	do
+		git branch topic$count topic &&
+		test_must_fail git rebase --onto master master topic$count &&
+		echo "Resolved" >F2 &&
+		git add F2 &&
+		touch F1 &&
+		git rebase --continue || exit 1
+		count=$(($count + 1))
+	done
+'
+
+test_done
-- 
1.7.1.1.36.g07b1c
Next: Johannes Schindelin
Message 1 of 5 in “Fix git rebase --continue to work with touched files”
  1. Fix git rebase --continue to work with touched filesDavid D. Kilzer, Jul 27, 2010
  2. Johannes SchindelinJul 27, 2010
  3. Ævar Arnfjörð BjarmasonJul 27, 2010
  4. Johannes SixtJul 27, 2010
  5. David D. KilzerJul 27, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.