Почему git push gerrit HEAD:refs/for/master используется вместо git push origin origin
Я только начал использовать геррит, и я хочу знать, почему мы должны сделать git push gerrit HEAD:refs/for/master
вместо того, чтобы делать git push origin master
Если я сделаю git push origin master
Я получаю сообщение об ошибке ! [remote rejected] master -> master (prohibited by Gerrit)
2 ответа
В документации для Gerrit, в частности в разделе "Push изменения", объясняется, что вы переходите к "магическому refs/for/'branch'
ref используя любой инструмент клиента Git ".
Следующее изображение взято из вступления к Герриту. Когда вы нажимаете на Геррита, вы делаете git push gerrit HEAD:refs/for/<BRANCH>
, Это подталкивает ваши изменения в область подготовки (на диаграмме "Ожидающие изменения"). Геррит на самом деле не имеет ветку под названием <BRANCH>
; это ложь клиенту git.
Внутри у Gerrit своя реализация стеков Git и SSH. Это позволяет ему обеспечить "волшебный" refs/for/<BRANCH>
рефов.
Когда получен push-запрос на создание ссылки в одном из этих пространств имен, Gerrit выполняет свою собственную логику для обновления базы данных, а затем лжет клиенту о результате операции. Успешный результат заставляет клиента верить, что Геррит создал ссылку, но в действительности Геррит вообще не создал ссылку. [ Ссылка - Геррит, "Песчаные детали" ].
После успешного исправления (т. Е. Исправление было передано Gerrit, [помещается в область подготовки "Pending Changes"], проверено и проверка пройдена) Gerrit помещает изменение из "Pending Changes" в " Авторитетный репозиторий ", подсчитывающий, в какую ветку его вставить, основываясь на магии, которую он совершил, когда вы нажали refs/for/<BRANCH>
, Таким образом, успешно проверенные патчи могут быть извлечены непосредственно из правильных ветвей Authoritative Repository
,
Чтобы избежать необходимости полностью указывать команду 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
Это согласно Герриту