Как применить необработанные запросы на получение исходящих данных от других форков в мой форк?

466

У проекта на GitHub, который у меня есть, есть новые запросы на извлечение, которые я хочу добавить в свой ответвление, которые автор еще не получил.

Есть ли простой способ применить pull-запрос от других вилок к моему форку? Есть ли здесь что-то еще, чего мне не хватает?

лук-порей
источник
8
Есть инструкция: gist.github.com/piscisaureus/3342247
Петр Мигдаль
Отражает ли это сетевой график на GitHub, если вы используете для этого команды git?
ADTC
Также может быть интересно найти все ответвления: stackoverflow.com/q/47798937/10245
Тим Абелл

Ответы:

276

Вы можете сделать это вручную довольно легко:

  • добавьте другой форк как удаленный репо:

    git remote add otherfork git://github.com/request-author/project.git
    
  • получить коммиты своего репо

    git fetch otherfork
    
  • Затем у вас есть два варианта применения запроса на удаление (если вы не хотите выбирать вариант 1.)

    1. Если вам не нужно применять также возможные фиксации, которые были добавлены между источником и запросом на удаление, вы можете просто перебазировать ветку, на которой был сформирован запрос на получение.

      git rebase master otherfork/pullrequest-branch
      
    2. Если вы хотите только коммиты в запросе на получение, укажите их SHA1 и выполните

      git cherry-pick <first-SHA1> <second-SHA1> <etc.>
      
CharlesB
источник
166
На самом деле, вы не должны использовать cherry-pick, он создает новые коммиты ... что, в свою очередь, вызовет путаницу, если вы отправите запрос на извлечение вверх по течению. Вместо этого вы должны объединиться так, как запрашивает запрос на удаление. Вам также не нужно добавлять пульт. git pull URL branchname
Теккуб
3
@Tekkub: согласен, может быть лучше избежать путаницы с вновь созданными коммитами. Слияние менее на мой взгляд, так как вы можете внести другие изменения в ветку, с которой вы объединяетесь
CharlesB
8
Да, но в этом случае он специально спросил, как вытащить запрос на извлечение в свою вилку. Потяните == объединить.
Теккуб
1
@CharlesB, поскольку GitHub автоматически добавляет новые коммиты в той же ветке в запрос на извлечение, не будет ли трудно получить какие-либо «другие изменения» (при условии, что запрашивающая сторона следует передовым методам и помещает изменения в отдельную ветку из продолжающейся разработки, поэтому что все коммиты релевантны), разве когда вы хотите получить только часть запроса на извлечение?
neverfox
4
Для тех, кто разделяет мой ментальный сбой, «otherfork» не ссылается на исходное репо, а ссылается на коммит из форка, который выдал запрос на извлечение в исходное репо. Не обращайте внимания на исходный репо и идите прямо к вилке, которая сделала запрос на извлечение. Вы хотите вручную извлечь коммит, на который ссылалась ссылка, и объединить его с вашим собственным.
Михаил Халили
282

Обновление: через веб-страницу

Вы также можете сделать это через веб-страницу github.

Я предполагаю, что у вас уже должна быть fork ( MyFork) общего repo ( BaseRepo), в котором есть ожидающий запрос на получение от OtherForkинтересующей вас fork ( ).

  1. Перейдите к fork ( OtherFork), который инициировал запрос на получение, который вы хотели бы получить в свой fork ( MyFork)
  2. Перейти на страницу запросов на получение OtherFork
  3. Нажмите новый запрос на извлечение
  4. Ожидающий запрос (ы) тяги должен быть предложен. Не забудьте выбрать правильную OtherForkветку тоже. Выберите с левой стороны в качестве основания вилку свою вилку ( MyFork) ( ВАЖНО ).
  5. Теперь опция View pull requestдолжна измениться на Create pull request. Нажмите это.

Теперь в вашем fork ( MyFork) должен быть отложенный запрос на получение , который вы можете просто принять.

Hotschke
источник
6
Работает красиво. Гораздо проще, чем строка cmd, и легко просматривать изменения. Спасибо.
Альвеолы
3
У меня были проблемы с поиском, как добраться до «OtherFork» в пользовательском интерфейсе. Чтобы легко добраться, просто измените URL с именем пользователя github. то есть github.com/userName/repoName
Чарльз
2
Я не смог увидеть ожидающие запросы извлечения, упомянутые в шаге 4. Вместо этого я выбрал ветвь, которая соответствовала запросу извлечения OtherFork, из правого раскрывающегося списка «сравнить». Затем я выбрал левую сторону в качестве базовой вилки, как описано выше, чтобы создать запрос на извлечение.
seddonym
Работает, если нет вилки. Например: github.com/OculusVR/RakNet/pull/61/files
Милан Бабушков
1
Точные слова с сайта githubs могут быть устаревшими, но процесс на месте. Супер просто - спасибо!
kevnk
73

Как Tekkub сказал ранее, вы можете просто вытянуть ветку напрямую. Большую часть времени с GitHub ветвь просто "master" на форке запрашивающего пользователя проекта.

Пример: git pull https://github.com/USER/PROJECT/ BRANCH

И в качестве практического примера:

Допустим, вы разветвляли проект github под названием safaribooks, и в исходном проекте есть следующий запрос на извлечение, который вы хотите поместить в свой форк:

введите описание изображения здесь

Затем, в клонированной папке проекта вашего форка, запустите:

git pull https://github.com/fermionic/safaribooks.git fix-str-decode
SciPhi
источник
20
Недостатком этого является то, что в ветви могут быть и другие вещи, кроме запроса на получение. Кроме того, вы должны найти правильный URL-адрес для форка автора запроса на извлечение. Если вы хотите использовать однострочник, лучше использовать git pull https://github.com/{upstream/project} refs/pull/{id}/headвместо этого.
Jbyler
1
@jbyler Если в ветке есть и другие вещи, я уверен, что GitHub все равно обновит их по запросу.
Тим Мэлоун
22

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

Шаг 1:

git remote add upstream <url>

Вы, вероятно, уже сделали этот шаг, но если нет, вам понадобится удаленный, определенный для вышестоящего проекта. URL - это клонированный URL проекта, который вы разветвили. Более подробную информацию можно найти в разделе « Настройка пульта для вилки» и « Синхронизация вилки» . upstreamэто имя, которое вы даете удаленному, и хотя оно может быть чем угодно, upstreamэто условное имя.

Шаг 2:

git pull upstream refs/pull/{id}/head

... где {id}номер запроса на извлечение. upstreamэто имя пульта, с которого нужно извлечь данные, т. е. просто «вверх по течению», если вы точно выполнили шаг 1. Это также может быть URL, в этом случае вы можете пропустить шаг 1.

Шаг 3:

Введите сообщение коммита для коммита слияния. Вы можете оставить значение по умолчанию, хотя я рекомендую дать хорошую однострочную сводку с номером запроса на получение, исправляемой проблемой и кратким описанием:

Merge PR#42, fixing VIM-652, support for mapping arbitrary IDEA actions
jbyler
источник
Также см. Связанный ответ с вариантом, который создает локальную ветвь с запросом на получение. И последний вариант: вы можете использовать, git pull upstream refs/pull/{id}/headчтобы получить коммиты в ваш локальный репозиторий, а затем ссылаться на них как FETCH_HEAD(например, git log ..FETCH_HEADпосмотреть, что в нем есть git merge FETCH_HEAD)
jbyler
как бы я пошел на перебазирование, чтобы запрос на вытягивание был во главе, и я мог избежать пузыря слияния?
Майкл Джонстон,
1
Это было решение, в котором я нуждался, потому что автор запроса на удаление удалил свое репо.
Jswetzen
20

Некоторая более подробная информация, которая сработала для меня.

Мой файл .git / config для разветвленного репо выглядит так:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = false
[remote "origin"]
        url = git@github.com:litzinger/angular-carousel.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
        rebase = true
[remote "source"]
        url = git://github.com/revolunet/angular-carousel.git
        fetch = +refs/heads/*:refs/remotes/source/*
        fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

Затем запустите «git fetch source», который затем перечислил все запросы извлечения из разветвленного репо.

 * [new ref]         refs/pull/54/head -> origin/pr/54
 * [new ref]         refs/pull/67/head -> origin/pr/67
 * [new ref]         refs/pull/69/head -> origin/pr/69
 * [new ref]         refs/pull/71/head -> origin/pr/71

А затем для слияния в конкретном запросе на запуск запустите "git merge master origin / pr / 67"

Брайан Литцингер
источник
1
Я отредактировал свой .git / config и добавил строки [remote "source"], но для проекта, который меня интересовал, и инструкции работали без нареканий. Мне нравится этот ответ.
Philo Vivero
3
Прекрасные советы можно найти в news.ycombinator.com/item?id=9051220 и help.github.com/articles/checking-out-pull-requests-locally намекает на это (удивительное) специфичное для GitHub удаленное refs/pull/пространство имен только для чтения ,
Филипп Дурбин
Если вы используете Smartgit, вы можете увидеть эти запросы (и закрытые) на графике журнала, если вы добавите smartgit.branch.otherRefs=notes;pullк smartgit.properties согласно syntevo.com/doc/display/SG/System+Properties - вы также можете объединить их оттуда ,
САПР bloke
Кстати, вы также можете попробовать это в командной строке с помощью git fetch source + refs /heads / *: refs / remotes / upstream / * + refs / pull / * / head: refs / remotes / origin / pr / *
lib
9

Что бы я сделал, это следующее;

git checkout master
git remote add #NAME# #ADDRESS TO REPO#
git fetch #USERNAME#
git checkout -b test_fork
git rebase #NAME#/#BRANCH#

Теперь я объединил изменения в тестовую ветку с именем test_fork. Так что любые изменения не испортят мое дерево.

При желании вы можете использовать cherry-pick, как описано выше, чтобы выбрать конкретный коммит, если это более предпочтительно.

Счастливых путешествий :)

MindTooth
источник
0

Я использую удобный скрипт для этого. Я запускаю скрипт, набрав:

git prfetch upstream

и он получает все запросы на извлечение из ветки upstream.

Для создания скрипта создайте файл ~/bin/git-prfetch.

Файл должен содержать следующее:

#!/bin/bash

if [ -z "$1" ]; then
    echo "Please supply the name of a remote to get pull requests from."
    exit 1
fi

git fetch $1 +refs/heads/\*:refs/remotes/$1/\* +refs/pull/\*/head:refs/remotes/$1/pr/\*

Убедитесь, что ваш путь включает скрипт, установив:

export PATH="$HOME/bin:$PATH"

Вы можете добавить этот файл, ~/.bashrcчтобы сделать изменение постоянным.

Теперь убедитесь, что вы добавили ответвление, от которого хотите получать запросы на извлечение:

git remote add upstream https://github.com/user/repo.git

А потом

git prfetch upstream
Ричард
источник