Как настроить конкретный восходящий refspec для Git при использовании с Gerrit? - PullRequest
17 голосов
/ 18 августа 2011

Я настраиваю Git с помощью Gerrit Code Review и ищу способ сделать необходимые команды Git относительно простыми для пользователей, которые могут быть новичками в Git.

КомандыЯ в настоящее время для запуска новой функциональной ветви по существу (при условии, что Геррит origin):

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

Это запускает новый рабочий пакет work1234, разветвленный от некоторого baseline, и последний толчок создаетветвь в Геррите и устанавливает верхний поток.Так что .git/config выглядит примерно так:

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

Теперь Геррит хочет, чтобы новые коммиты для проверки были переданы в специальную ссылку, например refs/for/work1234.Я могу сделать это вручную с помощью:

git push origin work1234:refs/for/work1234

Я хотел бы найти способ настроить .git/config, чтобы обычный git push выдвигал текущую ветку к refspec на удаленномчто требует Геррит.Я рассмотрел следующие git config области:

  • branch.<name>.* - кажется, не имеет какой-либо конкретной опции для установки push refspec
  • push.default - Я сортируюof хотеть upstream здесь
  • remote.<name>.push - я пробовал refs/heads/*:refs/for/* здесь, но git push всегда хочет протолкнуть все локальные ветви в этом случае, тогда как я просто хочу current branch

Если я не могу заставить Git делать это самостоятельно, я напишу небольшой скрипт-обертку, который полностью определяет refspecs.Тем не менее, было бы лучше, если бы Git мог изначально перемещаться в нужное место.

Ответы [ 4 ]

9 голосов
/ 22 августа 2011

В итоге я написал новый git-submit скрипт:

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

Я поместил этот скрипт в /usr/local/libexec/git-core/git-submit, и теперь есть одна команда для отправки нового кода Герриту на проверку:

$ git submit

Если Геррит не является пультом origin, тогда используйте git submit <remote> в зависимости от ситуации.

4 голосов
/ 16 февраля 2012

Два варианта, которые я нашел:

1) Проверьте проект, который я сделал, ggh: https://github.com/hobbs/ggh

2) Вы можете настроить push refspec по умолчанию на вашем пульте.Я только выяснил, как сделать это с помощью жестко закодированной удаленной ветви, все еще пытаясь выяснить, как подстановить символ удаленного refspec так, чтобы он всегда выдвигался к удаленному, который вы отслеживаете:

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = ssh://gerrit/repo
    push =  HEAD:refs/for/master
2 голосов
/ 08 августа 2012

Вот улучшение Грег Хьюгилл answer.

Создайте сценарий где-нибудь по пути, как в папке вашего профиля bin (создайте его, если необходимо, даже в Windows):

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

Со следующим содержимым:

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

Предположим, вы создаете ветку удаленного отслеживания, например:

$ git checkout -b MyBranch origin/master

Вы можете просто позвонить:

$ git submit

... в этом случае нажать refs/for/master.

0 голосов
/ 22 августа 2011
git config push.default upstream
git config branch.work1234.merge refs/for/work1234
git config branch.work1234.remote origin

или .git / config:

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

Я не уверен, есть ли способ разместить там где-нибудь шаблон, чтобы он работал для всех ветвей.

...