Как настроить конкретный push refspec для upstream для Git при использовании с Gerrit?
Я настраиваю Git с Gerrit Code Review и ищу способ сделать необходимые команды Git относительно простыми для пользователей, которые могут быть новичками в Git.
Команды, которые я сейчас запускаю для новой ветки функций, по существу (предполагается, что Gerrit имеет значение origin
):
git checkout baseline
git pull
git checkout -b work1234
git push -u origin work1234
Это запускает новый рабочий пакет work1234
, разветвленный от некоторого baseline
, а последний push создает ветвь в Gerrit и устанавливает восходящий поток. Итак .git/config
выглядит примерно так:
[branch "work1234"]
remote = origin
merge = refs/heads/work1234
Теперь Gerrit хочет, чтобы новые коммиты для проверки были перенесены на специальный refspec, например, refs/for/work1234
. Я могу сделать это вручную с помощью:
git push origin work1234:refs/for/work1234
Что мне нужно сделать, это найти способ настройки .git/config
, чтобы простой git push
переместил текущую ветвь в refspec на удаленный сервер, который требуется Gerrit. Я просмотрел следующие области git config
:
-
branch.<name>.*
- похоже, нет какой-либо конкретной опции для установки push refspec
-
push.default
- Я вроде хочу upstream
здесь
-
remote.<name>.push
- Я пробовал refs/heads/*:refs/for/*
здесь, но git push
всегда хочет вытолкнуть все локальные ветки в этом случае, в то время как мне просто нужна текущая ветка
Если я не могу сделать Git сделать это сам по себе, я напишу небольшую обертку script, которая полностью специфицирует refspec. Тем не менее, было бы лучше, если бы Git мог надавить на нужное место изначально.
Ответы
Ответ 1
В итоге я написал новый 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
Я помещаю этот script в /usr/local/libexec/git-core/git-submit
и теперь там одна команда для отправки нового кода Gerrit для просмотра:
$ git submit
Если Gerrit не является пультом origin
, используйте git submit <remote>
, если это необходимо.
Ответ 2
Два варианта, которые я нашел:
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
Ответ 3
Вот улучшение ответа Грега Хьюглилла.
Создайте script где-то на пути, например в папке 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
в этом случае.
Ответ 4
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
Я не уверен, есть ли способ разместить шаблон в любом месте, чтобы заставить его работать для всех ветвей.