Home

Awesome

FBShipIt

NOTE: This project is no longer maintained. Meta has switched to using a (currently) closed-source solution to this that we hope to release in the future. Existing Open Source users can check out Copybara.

FBShipIt is a library written in Hack for copying commits from one repository to another.

For example, Meta uses it to:

Major Features

Major Limitations

FBShipIt has been primarily designed for branches with linear histories; in particular, it does not understand merge commits.

Requirements

Installing

$ composer require facebook/fbshipit

How FBShipIt Works

There are three main concepts: phases, changesets, and filters.

ShipItPhase objects represent a high-level action, such as 'clone this repository', 'pull this repository', 'sync changesets', and 'push repository'.

Within the sync phase, a ShipItChangeset is an immutable object representing a commit.

Filters are functions that take a Changeset, and return a new, modified one.

Provided Phases

Using FBShipIt

You need to construct:

Filters are provided for common operations - the most frequent are:

Example

See the demo/ directory for a simple example to start from.

Using With An Empty Destination Repository

Add ShipItCreateNewRepoPhase to your phase list (after source init and pull phases), then run:

hhvm my_script.hack --create-new-repo

This will give you the path to a git repository with a single commit; you can then push it to your destination.

Using With An Existing Destination Repository

When there is at least one relevant commit in the source repository that is not in the destination repository, run:

hhvm my_script.hack --first-commit=FIRST_UNSYNCED_COMMIT_ID_GOES_HERE

Future Runs

Run your script with no arguments; FBShipIt adds tracking information to the commits it creates, so will automatically sync any new commits.

Reducing Common Code With Multiple Projects

We recommend splitting out common filters and phase setup to separate classes, and for these to be re-used between your projects. For an example from Facebook's usage, see FBCommonFilters

Further Examples

Some other code that might be useful for configuring FBShipIt can be found in fb-examples/.

License

FBShipIt is MIT-licensed.