Какова правильная конфигурация 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
работает нормально. Как это можно добиться без ручного редактирования файла конфигурации для каждого запроса на растяжение?
Ответы
Ответ 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