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

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

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

Ответ 1

Документация Gerrit, в частности раздел "Push changes" , объясняет, что вы нажимаете на "магический refs/for/'branch' ref, используя любые Git клиентский инструмент".

Следующее изображение взято из Intro to Gerrit. Когда вы нажимаете на Gerrit, вы делаете git push gerrit HEAD:refs/for/<BRANCH>. Это подталкивает ваши изменения к промежуточной области (на диаграмме "Ожидающие изменения" ). На самом деле у Gerrit нет ветки под названием <BRANCH>; он лежит на клиенте Git.

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

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

The Gerrit workflow

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

Ответ 2

Чтобы избежать необходимости полностью указывать команду 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

Это соответствует Gerrit