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

左心房为你撑大大i 提交于 2019-11-28 17:18:28

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.

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

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):

$ mkdir ~/bin
$ vi ~/bin/git-submit

With the following content:

#!/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

REMOTE_BRANCH=`git config --get "branch.$BRANCH.merge"`
if [ -z $REMOTE_BRANCH ]
then
    echo "There is no tracking information for the current branch."
    echo "If you wish to set tracking information for this branch you can do so with:"
    echo ""
    echo "    git branch --set-upstream $BRANCH <remote>/<branch>"
    echo ""
    exit 1
fi

git push $REMOTE HEAD:refs/for/$REMOTE_BRANCH

Supposing you create a remote tracking branch like:

$ git checkout -b MyBranch origin/master

You can simply call:

$ git submit

... to push to refs/for/master in this case.

git config push.default upstream
git config branch.work1234.merge refs/for/work1234
git config branch.work1234.remote origin

or .git/config:

[push]
        default = upstream
[branch "work1234"]
        merge = refs/for/work1234
        remote = origin

I'm not sure if there's a way to put a wildcard in there anywhere to make it work for all branches.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!