Почему 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

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

Другие вопросы по тегам