Как Геррит реализует свои "волшебные" ссылки?
В настоящее время я внедряю Gerrit в качестве центральной системы проверки кода. Пытаясь понять все тонкости Геррита, я застрял в предложении ниже. Взято из документации Gerrit:
Поскольку Gerrit реализует весь стек серверов SSH и Git в своем собственном пространстве процессов, Gerrit сохраняет полный контроль над тем, как обновляется хранилище, и какие ответы отправляются
git push
клиент вызывается конечным пользователем илиrepo upload
, Это позволяет Герриту предоставлять магические ссылки, такие какrefs/for/*
для подачи нового изменения иrefs/changes/*
для замены замены.
Что означает приведенное выше утверждение, в частности это предложение: "Как Gerrit реализует весь стек SSH и Git-сервера в своем собственном пространстве процессов"? Я попытался найти релевантные вопросы, но самое близкое, что я нашел, - это почему git push gerrit HEAD:refs/for/master используется вместо git push origin origin, но он не дает адекватного объяснения того, как реализовать стек сервера позволяет Герриту предоставлять магические ссылки. Извиняюсь, если подобные вопросы действительно задавались ранее. Спасибо!
1 ответ
Нетрудно реализовать магический реф даже в "обычном мерзавце". Вы просто должны реализовать pre-receive
или же update
подключите свой удаленный репозиторий, который распознает целевую ветвь push-сообщения и делает с ним все, что хочет (например, сохраняет push-запрос в другой ветви).
Хотя у меня нет никаких деталей реализации (я полагаю, это намного сложнее), это то же поведение, что и у Геррита. Вы нажимаете на refs/for/master
и он хранит его в refs/changes/66/5066/2
филиал (например).
Есть несколько примеров.