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 refspecpush.default
- I sort of wantupstream
hereremote.<name>.push
- I triedrefs/heads/*:refs/for/*
here butgit 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.
Here is an improvement of Greg Hewgill answer.
Create a script somewhere on the path, like on your profile bin folder (create one if necessary, even on Windows):
With the following content:
Supposing you create a remote tracking branch like:
You can simply call:
... to push to
refs/for/master
in this case.I ended up writing a new
git-submit
script: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:If Gerrit is not the
origin
remote, then usegit submit <remote>
as appropriate.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:
or .git/config:
I'm not sure if there's a way to put a wildcard in there anywhere to make it work for all branches.