Являются ли запросы на вытягивание частью Git или функцией таких инструментов, как GitHub, Gerrit и Atlassian Stash?

Запросы на вытягивание, похоже, являются распространенным способом проверки кода с помощью Git. Однако неясно, означает ли этот термин одно и то же при использовании встроенного git request-pull или другого инструмента.

Являются ли запросы на вытягивание внутренней функцией Git или это общий термин для таких инструментов, как GitHub, Gerrit или Atlassian Stash?

Сохраняются ли обсуждение и «результаты» проверки кода в истории коммитов Git или в отдельной базе данных?


person user3049984    schedule 29.11.2013    source источник


Ответы (3)


Запросы на вытягивание — это простая концепция, которая возникла при создании Git, но с тех пор была переведена на другие уровни.

Суть в том, что у вас нет прав push на репозиторий, в который вы хотите внести свой вклад, поэтому вместо этого вы создаете форк репозитория, создавая свою частную копию (кстати, клон уже делает это), и вместо этого вы вносите свой вклад в этот. Затем вы просите сопровождающего исходного репозитория внести ваши изменения. Таким образом, вы, по сути, отправляете патч.

Как я уже сказал, есть разные способы сделать это, но все сводится к тому, чтобы попросить сопровождающего внести ваши изменения, отсюда и название. Первоначальная цель, для которой был создан Git, — это ядро ​​Linux, и они всегда разрабатывались с использованием списков рассылки. Таким образом, для них запрос на вытягивание фактически отправляет патч по электронной почте; эти патчи на самом деле являются объектами коммитов, которым предшествует какой-то обычный материал для связи по электронной почте — у Git есть инструменты для их создания.

git request-pull — это аналогичный инструмент для создания сообщения с запросом на вытягивание. Но в данном случае это ближе к идее вытягивания. В то время как патчи можно просто применять, запросы, созданные request-pull, на самом деле говорят мейнтейнеру извлечь изменения из другого удаленного репозитория.

В книге по Git есть такой пример:

$ git request-pull origin/master myfork
The following changes since commit 1edee6b1d61823a2de3b09c160d7080b8d1b3a40:
  John Smith (1):
        added a new function

are available in the git repository at:

  git://githost/simplegit.git featureA

Jessica Smith (2):
      add limit to log function
      change log output to 30 from 25

 lib/simplegit.rb |   10 +++++++++-
 1 files changed, 9 insertions(+), 1 deletions(-)

Так что на самом деле это просто утилита для генерации сообщений для реализации основной концепции.

Другие хостеры исходного кода, такие как GitHub, делают то же самое. Когда вы создаете запрос на вытягивание на GitHub, вы просто создаете задачу, содержащую дополнительную информацию о коммитах, которые может получить сопровождающий. Конечно, все это находится на одном веб-сайте, они могут связать все немного больше и предоставить, например, эти кнопки слияния одним щелчком мыши.

Но основная концепция осталась прежней: попросить сопровождающего внести некоторые изменения, которые вы сделали. Единственная разница заключается в том, как передается этот запрос.

person poke    schedule 29.11.2013
comment
Привет, я вижу, вы цитируете git-scm.com/book/ch5-2.html но этот сайт был недоступен для меня уже несколько дней. Вы все еще можете добраться до него? - person stackunderflow; 29.11.2013
comment
@stackunderflow Это странно. Меня устраивает. Вы можете прочитать его из источника на GitHub. То же самое, только без красивой графики. - person poke; 29.11.2013
comment
Спасибо, это ценно! Здесь также есть доказательства любой проблемы: colabti.org/ irclogger/irclogger_log/git?date=2013-11-29;text=on Мне кажется, что это какой-то плохой кеш DNS. Кто-то, должно быть, смотрел, потому что теперь я могу добраться до git-scm.com/book/ ch5-2.html еще раз. - person stackunderflow; 29.11.2013
comment
ч5-2 это здорово! Это убеждает меня, что то, что я придумал вчера, в основном верно: github.com/anaran /LastScrollChrome/blob/master/contributing.md - person stackunderflow; 29.11.2013
comment
Спасибо за отличное объяснение! Я хочу реализовать код-ревью в корпоративной среде, поэтому я пытаюсь выяснить, использовать ли полностью отдельную систему (например, Atlassian Fisheye/Crucible), систему на основе Git или просто поручить рецензенту выполнять слияние без дополнительных инструментов. . Любое понимание этого? И разрешает ли поток запросов на вытягивание какие-либо комментарии/обсуждения (и их сохранение) до выполнения слияния? - person user3049984; 01.12.2013
comment
Ну, все сводится к тому, насколько сложно вы хотите это сделать. Например, ядро ​​Linux делает все с помощью исправлений, рассылаемых по списку рассылки. Так что по сути один присылает патч и другие могут его обсуждать, пока кто-то не решит его слить. В других проектах используется Gerrit, где всем управляет система, и вы должны придерживаться ее рабочего процесса довольно часто. много; но вы получаете большой контроль над тем, что происходит с кодом, и кто за что отвечает (по сути, ничто не проходит незаметно для кого-то другого). - person poke; 01.12.2013
comment
Более простой и менее ограничительной альтернативой было бы просто сказать каждому разработчику работать над ветками, а затем вы можете открыто обсудить их в списке рассылки, в системе отслеживания ошибок или даже на собрании, прежде чем они будут объединены с основной веткой. На GitHub вы можете сделать это очень хорошо, создав запрос на вытягивание для другой ветки того же репозитория. При самостоятельном размещении репозитория вы даже можете использовать что-то вроде Gitolite, чтобы ограничить доступ даже нажимайте на ветку master напрямую и предоставляйте доступ только нескольким доверенным разработчикам. - person poke; 01.12.2013

Команду git request-pull можно использовать для создания "запроса на вытягивание" в родном git. При запуске Git генерирует сводку изменений в проекте и URL-адрес репозитория Git, откуда можно извлечь код. Затем это можно отправить по почте в список рассылки или сопровождающим проекта, которые затем могут загружать изменения в свои собственные репозитории.

Этот раздел Pro Git книга содержит более подробную информацию о команде git request-pull.

person blacktide    schedule 29.11.2013

Суть в том, что у вас нет прав push на репозиторий, в который вы хотите внести свой вклад, поэтому вместо этого вы создаете форк репозитория, создавая свою частную копию (кстати, клон уже делает это), и вместо этого вы вносите свой вклад в этот.

Это больше не единственный вариант с Git 2.29 (4 квартал 2020 г.):

git receive-pack(man), который принимает запросы от git push, научился передавать большинство обновлений ссылок на аутсорсинг на новый хук proc-receive.

См. commit d6edc18, зафиксировать 1702ae6, , коммит 31e8595, коммит b913075, фиксация 63518a5, фиксация 195d6ea, фиксация 15d3af5, фиксация 38b9197 , коммит 917c612 (27 августа 2020 г.), автор Цзян Синь (jiangxin).
(объединено Хунио C Хамано -- gitster -- в commit 6c430a6, 25 сентября 2020 г.)

receive-pack: добавить новый хук proc-receive

Подписано: Цзян Синь

Git вызывает внутреннюю функцию execute_commands для обработки команд, отправленных клиентом git-receive-pack.

Независимо от того, какие ссылки отправляет пользователь, Git создает или обновляет соответствующие ссылки, если у пользователя есть разрешение на запись.

Участник, у которого нет прав на запись, не может отправлять данные в репозиторий напрямую.
Таким образом, участник должен записывать коммиты в альтернативное место и отправляет запрос на извлечение по электронной почте или другими способами.
Мы звоним этот рабочий процесс как распределенный рабочий процесс.

Было бы удобнее работать в централизованном рабочем процессе, подобно тому, что Gerrit предлагал для некоторых случаев.

Например, пользователь с правами только для чтения, который не может отправлять данные в ветку напрямую, может запустить следующий git push(man) для отправки коммитов на псевдоссылку (имеет префикс refs/for/, а не refs/heads/) для создания обзора кода.

git push origin \
    HEAD:refs/for/<branch-name>/<session>  

<branch-name> в приведенном выше примере может быть таким же простым, как master, или более сложным именем ветки, например foo/bar.
<session> в приведенной выше команде примера может быть именем локальной ветки на стороне клиента, например my/topic.

Мы не можем элегантно реализовать централизованный рабочий процесс, используя pre-receive + post-receive, потому что Git вызовет внутреннюю функцию execute_commands для создания ссылок (даже специальной псевдоссылки) между этими двумя хуками.
Несмотря на то, что мы можем удалить временно созданную псевдоссылку через хук post-receive наличие временной ссылки небезопасно для одновременных push-уведомлений.

Итак, добавьте фильтр и новый обработчик для поддержки такого рабочего процесса.

Фильтр будет проверять префикс имени ссылки, и если команда имеет специальное имя ссылки, фильтр включит определенное поле (run_proc_receive) для команды.
Команды с включенным этим полем будут выполняться новый обработчик (хук с именем proc-receive) вместо внутренней функции execute_commands.

Эту команду proc-receive можно использовать для создания запросов на вытягивание или отправки электронных писем для проверки кода.

Предложенный Junio, этот хук proc-receive читает команды, push-опции (необязательно) и отправляет результат, используя протокол в формате pkt-line.
В следующем примере буква S означает receive-pack, а буква H — хук. .

# Version and features negotiation.
S: PKT-LINE(version=1\0push-options atomic...)
S: flush-pkt
H: PKT-LINE(version=1\0push-options...)
H: flush-pkt  

# Send commands from server to the hook.
S: PKT-LINE(<old-oid> <new-oid> <ref>)
S: ... ...
S: flush-pkt
# Send push-options only if the 'push-options' feature is enabled.
S: PKT-LINE(push-option)
S: ... ...
S: flush-pkt  

# Receive result from the hook.
# OK, run this command successfully.
H: PKT-LINE(ok <ref>)
# NO, I reject it.
H: PKT-LINE(ng <ref> <reason>)
# Fall through, let 'receive-pack' to execute it.
H: PKT-LINE(ok <ref>)
H: PKT-LINE(option fall-through)
# OK, but has an alternate reference.  The alternate reference name
# and other status can be given in options
H: PKT-LINE(ok <ref>)
H: PKT-LINE(option refname <refname>)
H: PKT-LINE(option old-oid <old-oid>)
H: PKT-LINE(option new-oid <new-oid>)
H: PKT-LINE(option forced-update)
H: ... ...
H: flush-pkt  

После получения команды хук выполнит команду и может создать/обновить другую ссылку.

Например, команда для псевдоссылки refs/for/master/topic может создать/обновить другую ссылку, такую ​​как refs/pull/123/head.
Имя альтернативной ссылки и другой статус задаются в строках параметров.

Список команд, возвращенных proc-receive, заменит соответствующие команды, отправленные пользователем receive-pack, а receive-pack продолжит выполнение функции "execute_commands и других подпрограмм.

Наконец, результат выполнения этих команд будет сообщен конечному пользователю.

Функция отчетов от receive-pack до send-pack будет расширена в последнем коммите точно так же, как хук proc-receive сообщает receive-pack.

person VonC    schedule 26.09.2020