Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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:

  • branch.<name>.* - doesn't seem to have any specific option for setting the push refspec
  • push.default - I sort of want upstream here
  • remote.<name>.push - I tried refs/heads/*:refs/for/* here but git push always wants to push all local branches in this case, while I just want the current branch

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.

like image 381
Greg Hewgill Avatar asked Aug 18 '11 00:08

Greg Hewgill


People also ask

How do I set up an upstream repository?

The easiest way to set the upstream branch is to use the “git push” command with the “-u” option for upstream branch. Alternatively, you can use the “–set-upstream” option that is equivalent to the “-u” option. As an example, let's say that you created a branch named “branch” using the checkout command.

How does git know which repository to push to?

git directory that contains metadata about the repository. That's what Git uses to determine where to push your changes.

What is git push -- set upstream?

Git set-upstream. The git set-upstream allows you to set the default remote branch for your current local branch. By default, every pull command sets the master as your default remote branch.


2 Answers

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.

like image 57
Greg Hewgill Avatar answered Nov 11 '22 02:11

Greg Hewgill


Two options I've found:

1) Check out a project I made, ggh: https://github.com/hobbs/ggh

2) You can configure the default push refspec in your remote. I've only figured out how to do this with a hardcoded remote branch, still trying to figure out how to wildcard the remote refspec so that it always pushes to the remote you're tracking:

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = ssh://gerrit/repo
    push =  HEAD:refs/for/master
like image 42
Zach Hobbs Avatar answered Nov 11 '22 01:11

Zach Hobbs