Как я могу получить незаполненный пул-запрос для ветки, которой я не владею? - PullRequest
65 голосов
/ 19 июля 2011

Мне нужно получить конкретный запрос на извлечение (который еще не был обработан в основном потоке) в репозитории NServiceBus:

https://github.com/johnsimons/NServiceBus/commit/d8524d53094e8181716e771c1023e968132abc15

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

Каков наилучший способ сделать это?

Ответы [ 11 ]

70 голосов
/ 28 марта 2012

Чтобы получить извлечение в свой репозиторий:

git fetch git@github.com:jboss/jboss-common-beans.git refs/pull/4/head

Затем делайте что хотите с FETCH_HEAD:

git checkout -b new-branch FETCH_HEAD
53 голосов
/ 07 сентября 2015
git pull origin pull/28/head

Или

git fetch origin pull/28/head:28
git checkout 28

Могу ли я получить еще не слитый запрос на извлечение?

18 голосов
/ 10 марта 2015

Вы можете сделать это:

1) Добавьте вышестоящий пульт:

git remote add upstream git@github.com:Particular/NServiceBus.git

2) После этого вы можете оформить любой пул-запрос в новую ветку по его ID:

git fetch upstream pull/PULL_REQUEST_ID/head:NEW_BRANCH_NAME

Тогда у вас будет ветвь с именем NEW_BRANCH_NAME, содержащая код PR.

Добавление псевдонима:

Если вы делаете это так же часто, как я, вы можете настроить некоторые псевдонимы для него. У меня есть это в моем .gitconfig:

[alias]
    fetch-pr = "!f(){\
        [ -z \"$1\" ] && { echo Usage: git fetch-pr PULL_REQUEST_ID [REMOTE_NAME] [NEW_BRANCH_NAME]; exit 1; }; \
        remote=${2:-origin}; \
        branch=${3:-pr-$1}; \
        git fetch $remote \"pull/$1/head:$branch\"; \
        }; f "
    pr = "!f(){\
        branch=${3:-pr-$1}; \
        git fetch-pr \"$@\"; \
        git switch $branch; \
        }; f "

С вышеизложенным я могу сделать:

git fetch-pr 123              # fetch PR #123 into branch pr-123
git fetch-pr 123 some-branch  # fetch PR #123 into some-branch
git pr 123                    # fetch and switch to the branch
8 голосов
/ 17 ноября 2016

Для сложных ситуаций (особенно если у вас нет проверенного git-repo), я думаю, что самый простой способ - это применить патч.Для этого просто откройте pull-запрос на github и добавьте «.patch» к URL, скачайте его и примените патч.

Пример:

cd cordova-plugin-media
wget https://github.com/apache/cordova-plugin-media/pull/120.patch
patch -p1 < 120.patch
5 голосов
/ 22 мая 2014

См. Эту статью помощи от GitHub: https://help.github.com/articles/checking-out-pull-requests-locally

4 голосов

github / hub

https://github.com/github/hub - это помощник GitHub CLI, который прекрасно справляется с этим и другими случаями использования, используя дополнительную информацию из API GitHub.Например:

git clone https://github.com/github/hub
# Just copy paste the URL.
hub checkout https://github.com/github/hub/pull/970

Результат:

  • Сейчас мы находимся на ветке с именем <USERID>-<BRANCH_NAME>, которая содержит PR.

    Обратите внимание на хорошую веткуимя, которое было автоматически установлено для нас.

  • эта ветвь установлена ​​для отслеживания исходной ветви на вилке, то есть .git/config содержит:

    [branch "<USERID>-<BRANCH_NAME>"]
        remote = retronym
        merge = refs/heads/ticket/969
        rebase = true
    

    Так что еслидальнейшие коммиты подталкиваются, мы можем git fetch их напрямую.

Установка hub в Linux в настоящее время является проблемой, если вы не знакомы с Go, но оно того стоит.В Ubuntu 14.04 Go-репозитории слишком старые, поэтому GVM - лучший вариант:

bash < <(curl -LSs 'https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer')
. "$HOME/.gvm/scripts/gvm"
gvm install 'go1.4'
gvm use 'go1.4' --default
go get github.com/github/hub

Я также попросил GitHub предоставить нам паспорт для вставки копий в ИнтернетеПользовательский интерфейс: https://github.com/isaacs/github/issues/449

3 голосов
/ 04 июля 2017

После того, как вы добавили репозиторий в восходящем направлении как удаленный в обратном направлении (как указывал @elias):

$ git remote add upstream git@github.com:Particular/NServiceBus

Вы можете настроить git для получения запросов на получение по умолчанию:

$ git config --local --add remote.upstream.fetch '+refs/pull/*/head:refs/remotes/upstream/pr/*'

Итак, давайте возьмем это:

$ git fetch upstream
Fetching upstream
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 2), reused 4 (delta 2), pack-reused 0
Unpacking objects: 100% (4/4), done.
From https://github.com/Particular/NServiceBus
 * [new ref]         refs/pull/1/head -> upstream/pr/1
 * [new ref]         refs/pull/2/head -> upstream/pr/2

И проверим это:

$ git checkout pr/2
Branch pr/2 set up to track remote branch pr/2 from upstream.
Switched to a new branch 'pr/2'
1 голос
/ 11 апреля 2019

Вот команды, которые работали для меня.

Я предполагаю, что кто-то уже клонировал репо (например, pytorch ) в свою систему локально. После этого некоторые добровольцы / энтузиасты внесли некоторый код и выпустили PR в удаленный репозиторий, но он еще не был объединен в ведущую или любую другую ветку. Итак,

Сначала мы должны сделать git remote add для удаленного репозитория github:

# I've given the name `original`; you can give some other name as per your liking
$ git remote add original https://github.com/pytorch/pytorch

Затем cd в хранилище pytorch, а затем просто выполните:

# after this, the unmerged PR should be pulled to your local repo
$ git fetch original pull/<pull_number>/head    # 23, 123 etc.,

Теперь ожидающий PR был извлечен в ваш локальный репо, и конец вашей выборки будет в FETCH_HEAD. Если вы хотите объединить этот ожидающий PR локально , просто выполните:

$ git merge FETCH_HEAD

После этого, если вы сделаете:

$ git status

Вы должны быть в состоянии увидеть, что локальное репо опережает n коммитов, которые были частью ожидающего PR (то есть возможно выпустить более 1 коммита в одном PR). Таким образом, количество коммитов зависит от коммитов, содержащихся в ожидающем PR.

0 голосов
/ 20 апреля 2019

У Github есть понятный документ для объединения запроса извлечения в локальное репо:

https://help.github.com/en/articles/checking-out-pull-requests-locally

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

Я не смог найти такой же простой способ слияния запроса на извлечение в форк, который я создал на GitHub.

0 голосов
/ 03 ноября 2018

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

Вместо этого просто зайдите в свой репозиторий и извлеките коммит (из источника PR), используя его хэш коммита.

git pull https://bitbucket.org/SomeUser/SomeProjectRepo/commits/c15...db2

Делая это таким образом, у вас просто будет куча новых отредактированных файлов, как если бы вы редактировали их самостоятельно. Тогда вам решать, хотите ли вы зафиксировать эти метки / метки.

Если вы хотите отправить все новости в свое собственное репозиторий GitHub, просто сделайте как всегда:

git commit -m "Added something by Anonymous"
git push -u origin master
...