Почему 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)
В документации для Gerrit, в частности в разделе «Push-изменения» , объясняется, что вы переходите к «магическому refs/for/'branch'реф с использованием любого инструмента клиента Git».
Следующее изображение взято из вступления к Герриту . Когда вы нажимаете на Геррита, вы делаете git push gerrit HEAD:refs/for/<BRANCH>. Это подталкивает ваши изменения в область подготовки (на диаграмме «Ожидающие изменения»). На самом деле у Геррита нет ответвления <BRANCH>; это ложь клиенту git.
Внутри у Gerrit есть собственная реализация стеков Git и SSH. Это позволяет ему предоставлять «волшебные» refs/for/<BRANCH>ссылки.
Когда получен push-запрос на создание ссылки в одном из этих пространств имен, 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:
+1 от меня! Это намного приятнее, просто иметь это жестко для меня remote.origin.pushвместо того, чтобы печатать / вставлять его каждый раз!
DaoWen
7
@SeanMurphy Вы можете сделать его более общим, заменив экземпляры 'master' на '*', чтобы что-то вроде 'git push gerrit TopicBranch' также работало.
Дэвид Дория
Кроме того, если gerrit - ваш единственный пульт, вам не нужно указывать его вообще. Я просто делаю git fetchи git pushс конфигом @DavidDoria, упомянутым выше.
Бернк
push = refs / возглавляет / *: refs / for / * для всех ветвей
Виктор Чой
Вам действительно нужно использовать ветку upstream, а не текущую ветку. У меня обычно около дюжины изменений, происходящих параллельно, поэтому использование одной ветви просто не работает.
Чтобы избежать необходимости полностью указывать команду git push, вы можете изменить свой конфигурационный файл git:
Теперь вы можете просто:
Это согласно Герриту
источник
remote.origin.push
вместо того, чтобы печатать / вставлять его каждый раз!git fetch
иgit push
с конфигом @DavidDoria, упомянутым выше.