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

я в курсе как я могу проверить запрос GitHub pull?

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

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

Fetch и проверка работают нормально:

$ git fetch origin

... все хорошо!--13-->

$ 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

и это работает. Но как я могу настроить файл config так:

  1. fetch & checkout все еще работают, и
  2. последующие действия вытягивания работают без ручного указания удаленного ref?

я обнаружил, что если я редактирую файл config и измените:

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

4 ответов


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

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

после этого вы можете проверить ветку, которая указывает на PR remote ref:

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

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

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

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


из спецификаций выборки невозможно найти однозначно найти, что удаленная ссылка refs/remotes/origin/pr/123 трассы 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 checkout с явным именем ветви (которое должно быть доступно в GUIs) сможет создать правильную ссылку отслеживания:

$ 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.

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

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

...

$ hub pull
Already up-to-date.

Он имеет дополнительные утилиты для работы с GitHub pull-запросы, такие как

hub pull-request

Я думаю, что нашел решение, и это невероятно просто: порядок строк с 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).

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