Почему git push gerrit HEAD: refs / for / master используется вместо git push origin origin


148

Я только начал использовать геррит, и я хочу знать, почему мы должны делать git push gerrit HEAD:refs/for/masterвместо того, чтобы делатьgit push origin master

Если я git push origin masterполучаю сообщение об ошибке! [remote rejected] master -> master (prohibited by Gerrit)

Ответы:


259

В документации для Gerrit, в частности в разделе «Push-изменения» , объясняется, что вы переходите к «магическому refs/for/'branch'реф с использованием любого инструмента клиента Git».

Следующее изображение взято из вступления к Герриту . Когда вы нажимаете на Геррита, вы делаете git push gerrit HEAD:refs/for/<BRANCH>. Это подталкивает ваши изменения в область подготовки (на диаграмме «Ожидающие изменения»). На самом деле у Геррита нет ответвления <BRANCH>; это ложь клиенту git.

Внутри у Gerrit есть собственная реализация стеков Git и SSH. Это позволяет ему предоставлять «волшебные» refs/for/<BRANCH>ссылки.

Когда получен push-запрос на создание ссылки в одном из этих пространств имен, Gerrit выполняет собственную логику для обновления базы данных, а затем лжет клиенту о результате операции. Успешный результат заставляет клиента верить, что Геррит создал ссылку, но в действительности Геррит вообще не создал ссылку. [ Ссылка - Геррит, "Песчаные детали" ].

Рабочий процесс Gerrit

После успешного исправления (т. Е. Исправление было передано Gerrit, [помещается в область подготовки «Pending Changes»], проверено и проверка пройдена) Gerrit помещает изменение из «Pending Changes» в « Авторитетный Repository», вычисление которой ветви толкать его в на основе магии он сделал , когда толкнул refs/for/<BRANCH>. Таким образом, успешно проверенные патчи могут быть извлечены непосредственно из правильных ветвей Authoritative Repository.


Из любопытства, что на самом деле происходит, если вы делаете что-то вроде «git push origin»? Я попробовал это и нигде не вижу изменений, таким образом, вопрос. Но это существует в моем локальном журнале, естественно.

1
@Pintolaranja Я сделал то же самое случайно. Вы правы, Геррит "справляется" с такой ситуацией, но не вносит никаких изменений. Так что на самом деле, он не справляется с этим вообще. Что меня действительно бесит, так как это действительно глупо. Зачем разрешать пользователю совершать что-то, что Геррит не может правильно обработать?
Трейдер

1
@gregb Да. Стрелки указывают источник и назначение команды, а не какой-либо последующий поток данных в результате ее выполнения. например, Разработчик 1 выдает выборку в авторитетный репозиторий, а не наоборот
Гарет

5
@trejder Это позволяет, потому что Gerrit позволяет вам настроить некоторые учетные записи, чтобы обойти проверки. Нажимая на ветку по умолчанию, вы фактически говорите: «Я хочу объединить это изменение без обзора». Если вам не разрешено это делать, толчок не пройден.
Hounshell

4
Или вы не можете использовать геррит и вообще избежать этого смешного беспорядка.
С Джонсон

57

Чтобы избежать необходимости полностью указывать команду git push, вы можете изменить свой конфигурационный файл git:

[remote "gerrit"]
    url = https://your.gerrit.repo:44444/repo
    fetch = +refs/heads/master:refs/remotes/origin/master
    push = refs/heads/master:refs/for/master

Теперь вы можете просто:

git fetch gerrit
git push gerrit

Это согласно Герриту


1
+1 от меня! Это намного приятнее, просто иметь это жестко для меня remote.origin.pushвместо того, чтобы печатать / вставлять его каждый раз!
DaoWen

7
@SeanMurphy Вы можете сделать его более общим, заменив экземпляры 'master' на '*', чтобы что-то вроде 'git push gerrit TopicBranch' также работало.
Дэвид Дория

Кроме того, если gerrit - ваш единственный пульт, вам не нужно указывать его вообще. Я просто делаю git fetchи git pushс конфигом @DavidDoria, упомянутым выше.
Бернк

push = refs / возглавляет / *: refs / for / * для всех ветвей
Виктор Чой

Вам действительно нужно использовать ветку upstream, а не текущую ветку. У меня обычно около дюжины изменений, происходящих параллельно, поэтому использование одной ветви просто не работает.
Кристиан Гетце
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.