Подтвердить что ты не робот

Какова правильная конфигурация git для работы с запросами на выгрузку GitHub?

Я знаю Как я могу проверить запрос на извлечение GitHub?

При добавлении fetch = +refs/pull/*/head:refs/remotes/origin/pr/* в .git/config разрешает выборку и выгрузку, вытягивание действий не выполняется:

[remote "origin"]
    url = https://github.com/the/repo.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

Эффект Fetch и Checkout отлично работает:

$ git fetch origin

... все хорошо

$ git checkout -b "pr-123" origin/pr/123
Branch pr-123 set up to track remote branch pr/123 from origin.
Switched to a new branch 'pr-123'

... успех, получил код!

Но сбой не получается:

$ git pull
Your configuration specifies to merge with the ref 'refs/heads/pr/123' 
from the remote, but no such ref was fetched.

... не удалось.

Я могу указать ref вручную:

$ git pull origin refs/pull/123/head

и это работает. Но как настроить конфигурационный файл так, чтобы:

  • выборка и проверка еще работают, и
  • последующие действия pull работают без ручного указания удаленного ref?

Я обнаружил, что если отредактировать файл конфигурации и изменить:

[branch "pr-123"]
    remote = origin
    merge = refs/heads/pr/123

в

[branch "pr-123"]
    remote = origin
    merge = refs/pull/123/head  # <-- here is the change

... тогда git pull работает нормально. Как это можно добиться без ручного редактирования файла конфигурации для каждого запроса на растяжение?

4b9b3361

Ответ 1

Я думаю, что нашел решение, и это невероятно просто: порядок строк с fetch = +refs... имеет значение!

Я изменил:

[remote "origin"]
    url = https://github.com/the/repo.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

в

[remote "origin"]
    url = https://github.com/the/repo.git
    fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
    fetch = +refs/heads/*:refs/remotes/origin/*

(последние две строки заменены)

Теперь все работает (fetch, checkout, pull).

Я все еще жду, чтобы увидеть некоторые (un) ожидаемые проблемы с этой конфигурацией, но пока что так хорошо...

Ответ 2

Вы только извлекаете ветки, а не тянете запросы. Добавьте это в свою конфигурацию:

fetch = +refs/pull/*/head:refs/pulls/origin/pr/*

После этого вы можете проверить ветку, указывающую на удаленный PR:

git checkout -b "pr-123" pulls/origin/pr/123

Как правило, вы можете проверить ref, если вы извлекли его из удаленного, поэтому просмотрите вывод команды git fetch и найдите имя ссылки PR. Это то, что вы должны ввести в команду checkout. Вы должны увидеть что-то вроде:

[new ref] refs/pull/123/head -> refs/pulls/origin/pr/123

Обратите внимание, что вы можете подставить часть pulls для любого пользовательского префикса. Теперь вы можете создать ветвь и указать ее на pulls/origin/pr/123, что эквивалентно refs/pulls/origin/pr/123 (см. git refspec doc).

Ответ 3

Из спецификаций выборки невозможно однозначно найти ту удаленную ссылку refs/remotes/origin/pr/123 tracks origin:refs/pull/123/head, потому что origin:refs/heads/pr/123 также возможно. Чтобы помочь ему, вы можете использовать разные удаленные имена, например:

[remote "origin-pr"]
  url = <same as for origin>
  fetch = +refs/pull/*/head:refs/remotes/origin-pr/pr/*

Затем проверка git с явным именем ветки (которая должна быть доступна в графических интерфейсах) могла бы создать правильную ссылку отслеживания:

$ git checkout -b pr/123 origin-pr/pr/123

[branch "pr/123"]
 remote = origin-pr
 merge = refs/pull/123/head

Хотя, похоже, невозможно сделать простую работу git checkout br/123:

$ git checkout pr/123                         
error: pathspec 'pr/123' did not match any file(s) known to git.

Ответ 4

Один правильный способ: hub! :)

$ brew install hub
$ hub checkout https://github.com/github/hub/pull/123

...

$ hub pull
Already up-to-date.

У него есть дополнительные утилиты для работы с запросами Github pull, такими как

hub pull-request