2008/5/21 Junio C Hamano [off-list ref]:
Look at what the "switch to a1 branch after committing to b1" does again.
You modify "file1" and commit to "b1" and you now have a local change in
file1 (because you update only the index and not the work tree) that is
effectively a revert of what you committed just now, and a1 and b1 differs
at that path. You get "Entry 'file1' not uptodate. Cannot merge." when
you try to switch to "a1".
$ sh t6031-merge-recursive.sh -i -v
* expecting success:
: >file1 &&
git add file1 &&
git commit -m initial &&
git checkout -b a1 master &&
: >dummy &&
git add dummy &&
git commit -m a &&
git checkout -b b1 master &&
git update-index --chmod=+x file1 &&
git commit -m b1 &&
git checkout a1 &&
git merge-recursive master -- a1 b1 &&
test -x file1
Created initial commit bae7a40: initial
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file1
Switched to a new branch "a1"
Created commit 1f64f65: a
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 dummy
Switched to a new branch "b1"
Created commit 98a1cf4: b1
0 files changed, 0 insertions(+), 0 deletions(-)
mode change 100644 => 100755 file1
error: Entry 'file1' not uptodate. Cannot merge.
* FAIL 1: mode change in one branch: keep changed version
It did work for me when I tried it back then. Maybe I just accidentally
tested something else.
If we squash the following on top of your patch, I think we can help
filesystems without executable bit without breaking filesystems with one.
Can you see if it works on your executable-bit-less setup?
Not in the moment.
quoted hunk ↗ jump to hunk
-- >8 --
t/t6031-merge-recursive.sh | 5 +++++
1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/t/t6031-merge-recursive.sh b/t/t6031-merge-recursive.sh
index f1c91c8..8073e0c 100755
--- a/t/t6031-merge-recursive.sh
+++ b/t/t6031-merge-recursive.sh
@@ -3,6 +3,9 @@
test_description='merge-recursive: handle file mode'
. ./test-lib.sh
+# Note that we follow "chmod +x F" with "update-index --chmod=+x F" to
+# help filesystems that do not have the executable bit.
+
test_expect_success 'mode change in one branch: keep changed version' '
: >file1 &&
git add file1 &&@@ -12,6 +15,7 @@ test_expect_success 'mode change in one branch: keep changed version' '
git add dummy &&
git commit -m a &&
git checkout -b b1 master &&
+ chmod +x file1 &&
Now, this is pointless in my setup. Cygwin just ignores the operation
and decidedddds (presumably according the file _content_ or maybe
phase of the moon) that is not executable. Working tree is still modified.
Maybe I should just live with it (and disable the test locally). It is just
very broken system which hopefully no one besides me ever gets to see.