Recently I have observed very strange failures in "git rebase" that cause it to 
fail to work automatically in situations where it should trivially be able to 
do so.

In case it matter, here's my setup: git 1.8.2.rc2.4.g7799588 (i.e. git.git 
master branch) on Mac OS X. The repos clone is on a HFS+ partition, not on a 
network volume. No gitattributes are being used.  Regarding the origin of the 
repos (I hope it doesn't matter, but just in case): The repository in question 
used to be a CVS repository; it was decided to switch to Mercurial (not my 
decision ;-) and I performed the conversion; I first converted it to git using 
cvs2git (from the cvs2svn suite), then performed some history cleanup, and 
finally used "hg convert" to convert it to git. Recently, I have been accessing 
the repository from git via the gitifyhg tool 
<https://github.com/buchuki/gitifyhg>. 

Anyway, several strange things just happened (and I had similar experiences in 
the past days and weeks, but that was using an older git, and I thought I was 
just doing something wrong).

Specifically, I wanted to rebase a branch with some experimental commits. The 
strange things started with this:

$ git rebase MY-NEW-BASE
First, rewinding head to replay your work on top of it...
Applying: SOME COMMIT
Applying: SOME OTHER COMMIT
...
Applying: COMMIT A
Applying: COMMIT B
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
error: Your local changes to the following files would be overwritten by merge:
        some/source.file
Please, commit your changes or stash them before you can merge.
Aborting
Failed to merge in the changes.
Patch failed at 0014 COMMIT B
The copy of the patch that failed is found in:
   /path/to/my/repo/.git/rebase-apply/patch

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".


Now, what is strange about this is that the failed patch actually applies 
cleanly:

$ patch -p1 < /path/to/my/repo/.git/rebase-apply/patch
patching file some/source.file
$

And there is no subtle merge issue here, either: That patch is the only one to 
have touched the surrounding code since 1999! There is no source of conflict 
there!

Anyway. The tale gets stranger, as I was trying to do this again (no changes 
were made to the repos in between, this is a straight continuation from above):

$ git rebase --abort
$ git rebase MY-NEW-BASE
First, rewinding head to replay your work on top of it...
Applying: SOME COMMIT
Applying: SOME OTHER COMMIT
...
Applying: COMMIT A
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
error: Your local changes to the following files would be overwritten by merge:
        some/othersource.file
        some/yetanother.file
Please, commit your changes or stash them before you can merge.
Aborting
Failed to merge in the changes.
Patch failed at 0013 COMMIT A
The copy of the patch that failed is found in:
   /path/to/my/repo/.git/rebase-apply/patch

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".



So suddenly it fails to apply the commit A, the one before the previously 
failing commit. Huh? But again, the failing patch applies cleanly (and after 
all, rebase was able to apply it in my previous attempt).  And again, the patch 
actually applies cleanly. So one more try:


$ git rebase --abort
$ git rebase MY-NEW-BASE
First, rewinding head to replay your work on top of it...
Applying: SOME COMMIT
Applying: SOME OTHER COMMIT
...
Applying: COMMIT A
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
error: Your local changes to the following files would be overwritten by merge:
        some/othersource.file
Please, commit your changes or stash them before you can merge.
Aborting
Failed to merge in the changes.
Patch failed at 0013 COMMIT A
The copy of the patch that failed is found in:
   /path/to/my/repo/.git/rebase-apply/patch

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".


Again it fails in commit A -- but this time, it only thinks one file is 
problematic. HUH? Again, the patch actually applies cleanly:

$ patch -p1 < /path/to/my/repo/.git/rebase-apply/patch
patching file some/othersource.file
patching file some/yetanother.file


At this point, things stabilized, and when I now abort and reattempt the merge, 
it always fails in the same way. This time trying to apply a change to a code 
comment that was last changed in 1997 (though for one hunk, a few lines before 
the changed lines, there is a line that was changed in 2008... but I assure 
you, that line is there in the ancestors of both the branch I want to rebase, 
and also in the MY-NEW-BASE branch I rebase onto).


Something seems to be really fishy here and I wonder if anybody has an idea 
what's going wrong here. Is this a bug in git? Is my repos broken in some way? 
Note that "git fsck" reported nothing except some dangling objects. Any other 
ideas? 


Cheers,
Max

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to