So somebody on our team moved an entire folder into a subdirectory without using hg’s rename feature. The directory structure is like we need it, but the history is now gone prior to the move. It shows it as a new file when the move occurred. Numerous large merges have happened since then, and so it is not really practical to go back in time and do it right.
I have tried hg log --follow and it does not help, since hg does not know about the rename. Is there any way to manually link the files to the old removed versions after the fact, or is there some facility like the way git can infer moves and renames based on hueristics? It would be nice if there was some way to explicitly say, “this file is a continuation of this old deleted file.”, even though that would still take some time to fix it all up right.
We have all but given up on ever getting that history back, but it would be really nice to have it.
You need to redo the move correctly by explicitly telling Mercurial what files were moved, then merge the broken changesets. This way you will restore the history path to the original files.
Steps, assuming
<x>is the move revision, and<y>is the current head revision.hg update <x-1>hg renameorhg rename --afterhg merge <x>), this should have no conflicts but if there are discard all changes.hg merge <y>)Here is the basic process shown on the command line:
Move incorrectly:
Correct the move:
Merge it with the broken move:
As you can see, the history now correctly shows all affected changesets. If the files are moved in several commits, the basic principle stays the same just merge across more than just 1 commit. If you have any commits made after the move, I recommend to merge them in separately (step 6 in the steps above) in order to avoid spurious conflicts.