2012-05-05 6 views
110

Я только начал использовать Геррит, и я хочу знать, почему мы должны делать git push gerrit HEAD:refs/for/master вместо делать git push origin masterПочему мерзавец толчок Геррит ГОЛОВА: рефы/для/мастеров использовали вместо мастера мерзавец толчок происхождения

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

ответ

203

документация для Геррит, в частности, раздел "Push changes", объясняет, что вы нажимаете на «волшебную refs/for/'branch' исх с помощью любого клиента инструмент Git».

следующее изображение взято из the 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 вообще. [Link - Gerrit, "Gritty Details"].

The Gerrit workflow

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

+6

Это прекрасный ответ. Спасибо :) – Shrayas

+0

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

+1

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

37

Для того, чтобы избежать необходимости полностью указать мерзавец нажимной команду, в качестве альтернативы может изменить ваш 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

+1

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

+0

Работает как шарм –

+5

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