gitpushgerritrefspec

How to configure specific upstream push refspec for Git when used with Gerrit?


I'm setting up Git with Gerrit Code Review and am looking for a way to make the necessary Git commands relatively straightforward for users who might be new to Git.

The commands I currently have for starting a new feature branch are essentially (assuming Gerrit is origin):

git checkout baseline
git pull
git checkout -b work1234
git push -u origin work1234

This starts a new work package work1234 branched from some baseline, and the final push creates the branch in Gerrit and sets the upstream. So .git/config looks something like:

[branch "work1234"]
        remote = origin
        merge = refs/heads/work1234

Now, Gerrit wants new commits for review to be pushed to a special refspec, refs/for/work1234 for example. I can do this manually with:

git push origin work1234:refs/for/work1234

What I would like to do is find some way to set up .git/config so that a plain git push will push the current branch to the refspec on the remote that Gerrit requires. I have looked at the following git config areas:

If I can't make Git do this by itself, I'll write a small wrapper script that fully specifies the refspecs. However, it would be better if Git could push to the right place natively.


Solution

  • I ended up writing a new git-submit script:

    #!/bin/sh -e
    
    if [ -z "$1" ]; then
        REMOTE=origin
    else
        REMOTE=$1
    fi
    
    BRANCH=`git symbolic-ref HEAD`
    case $BRANCH in
        refs/heads/*)
            BRANCH=`basename $BRANCH`
            ;;
        *)
            echo "I can't figure out which branch you are on."
            exit 1
            ;;
    esac
    
    git push $REMOTE HEAD:refs/for/$BRANCH
    

    I put this script in /usr/local/libexec/git-core/git-submit and now there's one command to submit new code to Gerrit for review:

    $ git submit
    

    If Gerrit is not the origin remote, then use git submit <remote> as appropriate.