Kiln Harmony is complicated, and has lots of edge-cases it needs to handle. We'll be publishing a whole series of blog posts that explore exactly how Kiln Harmony works. In the mean time, though, just because I think it might spawn some interesting discussion, here is a <i>non-exhaustive</i> list of edge-cases we translate:<p><pre><code> * Git octopus merges
* Mercurial descriptions that are not UTF-8
* Git commits whose messages aren't in their nominal encoding
* Mercurial and Git having invalid timestamps
* Git having a different author from committer
* Git and Mercurial commits and changesets with extra metadata
* Mercurial usernames that are not valid Git usernames
* Mercurial bookmarks that are not valid Git refs
* Mercurial named branches
* Git annotated tags (requires an not-quite-yet-released extension to fully round-trip; the non-annotated part of the tag works today and will be forwards-compatible)
* Mercurial changesets/manifests/filelogs with bad parent data
* Git trees that are just flat-up invalid
* Subrepos and submodules (100% preservation, but we can only
translate Git submodules/subrepos cleanly to/from each other,
since Git submodules have to be Git)
</code></pre>
There's more, but hopefully that gives you some idea what we were up against. Again, I'll be publishing a series of articles that explore <i>how</i> we handle all the above edge-cases beginning really soon.