GIT-DROVER(1)

NAME
git-drover - Apply a commit from the trunk to a release branch, or from one release branch to another.

SYNOPSIS

git drover --branch <branch>
           (--cherry-pick <change> | --continue [path_to_workdir] |
            --abort [path_to_workdir])
           [--parent_checkout <path-to-existing-checkout>]
           [--verbose] [--dry-run]

DESCRIPTION

git drover applies a commit to a release branch. It creates a new workdir from an existing checkout to avoid downloading a new checkout without affecting the existing checkout.

git drover does not support reverts. See the EXAMPLE section for the equivalent sequence of commands to run.

OPTIONS

--branch <branch>
    The branch to cherry-pick the commit to.

--cherry-pick <commit>
    The commit to cherry-pick.

--continue [path_to_workdir]
    Continue a cherry-pick that required manual resolution. The path to the drover workdir is optional. If unspecified, the current directory is used.

--abort [path_to_workdir]
    Abort a cherry-pick that required manual resolution and clean up its workdir. The path to the drover workdir is optional. If unspecified, the current directory is used.

--parent_checkout
    The path to the chromium checkout to use as the source for a creating git-new-workdir workdir to use for cherry-picking. If unspecified, the current directory is used.

-v, --verbose
    Enable verbose logging.

--dry-run
    Skip landing the cherry-pick. Just ensure that the commit can be cherry-picked into the branch.

EXAMPLE

  PREREQUISITES

Before working with branches, you must gclient sync --with_branch_heads at least once to fetch the branches.

Merge Example

        # Here's a commit (from some.committer) that we want to 'drover'.
        $ git log -n 1 --pretty=fuller
        commit 386bdd1dc15d367d7c33aa5d2ae5d10eb4b278bf
        Author:     some.committer <some.committer@chromium.org>
        AuthorDate: Thu Apr 10 08:54:46 2014 +0000
        Commit:     some.committer <some.committer@chromium.org>
        CommitDate: Thu Apr 10 08:54:46 2014 +0000
            This change needs to go to branch 9999
        # Now do the 'drover'.
        $ git drover --branch 9999 --cherry-pick 386bdd1dc15d367d7c33aa5d2ae5d10eb4b278bf
        Going to cherry-pick
        """
        commit 386bdd1dc15d367d7c33aa5d2ae5d10eb4b278bf
        Author: some.committer <some.committer@chromium.org>
        Date:   Thu Apr 10 08:54:46 2014 +0000
            This change needs to go to branch 9999
        """
        to 9999. Continue (y/n)? y
        # A cl is uploaded to rietveld, where it can be reviewed before landing.
        About to land on 9999. Continue (y/n)? y
        # The cherry-pick cl is landed on the branch 9999.

Merge with Conflicts Example

        # Here's a commit (from some.committer) that we want to 'drover'.
        $ git log -n 1 --pretty=fuller
        commit 870faa8f7621b82b98e2e9a29056dff1fbf6b713
        Author:     some.committer <some.committer@chromium.org>
        AuthorDate: Thu Apr 10 08:54:46 2014 +0000
        Commit:     some.committer <some.committer@chromium.org>
        CommitDate: Thu Apr 10 08:54:46 2014 +0000
            This change needs to go to branch 9999
        # Now do the 'drover'.
        $ git drover --branch 9999 --cherry-pick 870faa8f7621b82b98e2e9a29056dff1fbf6b713
        Going to cherry-pick
        """
        commit 870faa8f7621b82b98e2e9a29056dff1fbf6b713
        Author: some.committer <some.committer@chromium.org>
        Date:   Thu Apr 10 08:54:46 2014 +0000
            This change needs to go to branch 9999
        """
        to 9999. Continue (y/n)? y
        Error: Patch failed to apply.
        A workdir for this cherry-pick has been created in
          /tmp/drover_9999
        To continue, resolve the conflicts there and run
          git drover --continue /tmp/drover_9999
        To abort this cherry-pick run
          git drover --abort /tmp/drover_9999
        $ pushd /tmp/drover_9999
        # Manually resolve conflicts.
        $ git add path/to/file_with_conflicts
        $ popd
        $ git drover --continue /tmp/drover_9999
        # A cl is uploaded to rietveld, where it can be reviewed before landing.
        About to land on 9999. Continue (y/n)? y
        # The cherry-pick cl is landed on the branch 9999.

Revert Example

        # Make sure we have the most up-to-date branch sources.
        $ git fetch
        # Checkout the branch with the change we want to revert.
        $ git checkout -b drover_9999 branch-heads/9999
        Branch drover_9999 set up to track remote ref refs/branch-heads/9999.
        # Here's the commit we want to revert.
        $ git log -n 1
        commit 7066f3820fe39e50400b9d406a394117f807538e
        Author: some.committer <some.committer@chromium.org>
        Date:   Thu Apr 10 08:54:46 2014 +0000
            This change is horribly broken.
        # Now do the revert.
        $ git revert 7066f3820fe39e50400b9d406a394117f807538e
        # That reverted the change and committed the revert.
        $ git log -n 1
        commit 13e37b2a88d8fcd4ca4a55a4db27c619345f8396
        Author: you <you@chromium.org>
        Date:   Thu Apr 10 09:11:36 2014 +0000
            Revert "This change is horribly broken."
            This reverts commit 7066f3820fe39e50400b9d406a394117f807538e.
        # As with old drover, reverts are generally OK to commit without LGTM.
        $ git cl upload -r some.committer@chromium.org --send-mail
        $ git cl land --bypass-hooks

    If your cherrypick onto a release branch gets reverted, do not create a new cherrypick from master onto that release branch. Instead, use the "Reland" button on the original cherrypick CL.

Manual Merge Example

        # Make sure we have the most up-to-date branch sources.
        $ git fetch
        # Here's a commit (from some.committer) that we want to 'drover'.
        $ git log -n 1 --pretty=fuller
        commit 54631489ecf24a4ae3f5a12c393619a717cee85a
        Author:     some.committer <some.committer@chromium.org>
        AuthorDate: Thu Apr 10 08:54:46 2014 +0000
        Commit:     some.committer <some.committer@chromium.org>
        CommitDate: Thu Apr 10 08:54:46 2014 +0000
            This change needs to go to branch 9999
        # Checkout the branch we want to 'drover' to.
        $ git checkout -b drover_9999 branch-heads/9999
        Branch drover_9999 set up to track remote ref refs/branch-heads/9999.
        # Now do the 'drover'.
        # IMPORTANT!!! Do Not leave off the '-x' flag
        $ git cherry-pick -x 54631489ecf24a4ae3f5a12c393619a717cee85a
        [drover_9999 56188f1] This change needs to go to branch 9999
         Author: some.committer <some.committer@chromium.org>
         Date: Thu Apr 10 08:54:46 2014 +0000
         1 file changed, 1 insertion(+)
         create mode 100644 modified_file
        # That took the code authored by some.committer and committed it to
        # the branch by the person who drovered it (i.e. you).
        $ git log -n 1 --pretty=fuller
        commit 56188f1e5b44b5ce95394d41912e980bccca8cc2
        Author:     some.committer <some.committer@chromium.org>
        AuthorDate: Thu Apr 10 08:54:46 2014 +0000
        Commit:     you <you@chromium.org>
        CommitDate: Thu Apr 10 09:11:36 2014 +0000
            This change needs to go to branch 9999
            (cherry picked from commit 54631489ecf24a4ae3f5a12c393619a717cee85a)
        # Looks good. Ship it!
        $ git cl upload
        # Wait for LGTM or TBR it.
        $ git cl land
        # Or skip the LGTM/TBR and just 'git cl land --bypass-hooks'

    If git cl upload errors out, the branch you’re uploading to probably has a CL with the same Change-Id. Instead of cherry-picking manually, use the Reland button in the Gerrit UI to create a new CL, and patch that CL into your client.

SEE ALSO

git-cherry-pick(1), git-revert(1)

CHROMIUM DEPOT_TOOLS

Part of the chromium depot_tools(7) suite. These tools are meant to assist with the development of chromium and related projects. Download the tools from here[1].

NOTES

1.  here
    https://chromium.googlesource.com/chromium/tools/depot_tools.git