Using a git clone of gecko-dev to push to mercurial
[Update: An up-to-date version of this document is available on the git-cinnabar wiki]
The next branch of git-cinnabar now has minimal support for grafting, enough to allow to graft a clone of gecko-dev to mozilla-central and other Mozilla branches. This will be available in version 0.3 (which I don't expect to release before June), but if you are interested, you can already try it.
There are two ways you can work with gecko-dev and git-cinnabar.
Switching to git-cinnabar
This is the recommended setup.
There are several reasons one would want to start from gecko-dev instead of a fresh clone of mozilla-central. One is to get the full history from before Mozilla switched to Mercurial, which gecko-dev contains. Another is if you already have a gecko-dev clone with local branches, where rebasing against a fresh clone would not be very convenient (but not impossible).
The idea here is to use gecko-dev as a start point, and from there on, use cinnabar to pull and push from/to Mercurial. The main caveat is that new commits pulled from Mercurial after this will not have the same SHA-1s as those on gecko-dev. Only the commits until the switch will. This also means different people grafting gecko-dev at different moments will have different SHA-1s for new commits. Eventually, I hope we can switch gecko-dev itself to use git-cinnabar instead of hg-git, which would solve this issue.
Assuming you already have a gecko-dev clone, and git-cinnabar next installed:
- Change the remote URL:
$ git remote set-url origin hg::https://hg.mozilla.org/mozilla-central
(replace
originwith the remote name forgecko-devif it's notorigin) - Add other mercurial repositories you want to track as well:
$ git remote add inbound hg::https://hg.mozilla.org/integration/mozilla-inbound $ git remote add aurora hg::https://hg.mozilla.org/releases/mozilla-aurora (...)
- Pull with grafting enabled:
$ git -c cinnabar.graft=true -c cinnabar.graft-refs=refs/remotes/origin/* remote update
(replace
originwith the remote name forgecko-devif it's notorigin) - Finish the setup by setting push urls for all those remotes:
$ git remote set-url --push origin hg::ssh://hg.mozilla.org/mozilla-central $ git remote set-url --push inbound hg::ssh://hg.mozilla.org/integration/mozilla-inbound $ git remote set-url --push aurora hg::ssh://hg.mozilla.org/releases/mozilla-aurora (...)
Now, you're mostly done setting things up. Check out my git workflow for Gecko development for how to work from there.
Following gecko-dev
This setup allows to keep pulling from gecko-dev and thus keep the same SHA-1s. It relies on everything pulled from Mercurial existing in gecko-dev, which makes it cumbersome, which is why I don't recommend using it. For instance, you may end up pulling from Mercurial before the server-side mirroring made things available in gecko-dev, and that will fail. Some commands such as git pull --rebase will require you to ensure gecko-dev is up-to-date first (that makes winning push races essentially impossible). And more importantly, in some cases, what you push to Mercurial won't have the same commit SHA-1 in gecko-dev, so you'll have to manually deal with that (fortunately, it most cases, this shouldn't happen).
Assuming you already have a gecko-dev clone, and git-cinnabar next installed:
- Add a remote for all mercurial repositories you want to track:
$ git remote add central hg::https://hg.mozilla.org/mozilla-central $ git remote add inbound hg::https://hg.mozilla.org/integration/mozilla-inbound $ git remote add aurora hg::https://hg.mozilla.org/releases/mozilla-aurora (...)
- For each of those remotes, set a push url:
$ git remote set-url --push origin hg::ssh://hg.mozilla.org/mozilla-central $ git remote set-url --push inbound hg::ssh://hg.mozilla.org/integration/mozilla-inbound $ git remote set-url --push aurora hg::ssh://hg.mozilla.org/releases/mozilla-aurora (...)
- For each of those remotes, set a refspec that limits to pulling the tip of the default branch:
$ git config remote.central.fetch +refs/heads/branches/default/tip:refs/remotes/central/default $ git config remote.inbound.fetch +refs/heads/branches/default/tip:refs/remotes/inbound/default $ git config remote.aurora.fetch +refs/heads/branches/default/tip:refs/remotes/aurora/default (...)
Other branches can be added, but that must be done with care, because not all branches are exposed on
gecko-dev. - Set git-cinnabar grafting mode permanently:
$ git config cinnabar.graft only
- Make git-cinnabar never store metadata when pushing:
$ git config cinnabar.data never
- Make git-cinnabar only graft with
gecko-devcommits:
$ git config cinnabar.graft-refs refs/remotes/origin/*
(replace
originwith the remote name forgecko-devif it's notorigin) - Then pull from all remotes:
$ git remote update
Retry as long as you see errors about "Not allowing non-graft import". This will keep happening until all Mercurial changesets you're trying to pull make it to
gecko-dev.
With this setup, you can now happily push to Mercurial and see your commits appear in gecko-dev after a while. As long as you don't copy or move files, their SHA-1 should be the same as what you pushed.
2015-05-01 07:32:22+0900
Responses are currently closed, but you can trackback from your own site.

2015-06-16 09:48:07+0900
There is a missing “config” in the “git remote.aurora.fetch…” instructions.
2015-06-18 11:37:32+0900
@past: Fixed. Thanks.