Mozilla: Using a git clone of gecko‐dev to push to mercurial

Mike Hommey edited this page Jul 10, 2018 · 7 revisions

The following setups require version 0.3.0 or higher of git-cinnabar.

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 0.3.0 or higher installed:

  • Change the remote URL:
$ git remote set-url origin hg::https://hg.mozilla.org/mozilla-central

(replace origin with the remote name for gecko-dev if it's not origin)

  • 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 remote update

If you are using git-cinnabar 0.5.0b4 or newer, or master, you can use the following instead, for something faster:

$ git -c cinnabar.clone=https://github.com/glandium/gecko-dev -c cinnabar.graft=true remote update
  • 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 the 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 in some ways, 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 0.3.0 or higher 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
(...)

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 true
  • Then pull from all remotes:
$ git remote update

If you are using git-cinnabar 0.5.0b4 or newer, or master, you can use the following instead, for something faster:

$ git -c cinnabar.clone=https://github.com/glandium/gecko-dev remote update

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.

You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.