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

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

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

Это явно не мое репо, но мне нужны изменения, которые существуют в этом запросе на pull.

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

Ответ 1

Чтобы извлечь файл в ваш репозиторий:

git fetch [email protected]:jboss/jboss-common-beans.git refs/pull/4/head

Затем сделайте все, что хотите, с помощью FETCH_HEAD:

git checkout -b new-branch FETCH_HEAD

Ответ 3

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

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

git remote add upstream [email protected]: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 \"[email protected]\"; \
        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

Ответ 4

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

Пример:

cd cordova-plugin-media
wget https://github.com/apache/cordova-plugin-media/pull/120.patch
patch -p1 < 120.patch

Ответ 6

GitHub/концентратор

https://github.com/github/hub - это помощник CLI GitHub, который отлично справляется с этим и другими вариантами использования, используя дополнительную информацию из 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 on the repositories является слишком старым, поэтому 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

Ответ 7

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

$ git remote add upstream [email protected]: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'

Ответ 8

Вот команды, которые помогли мне.

Я предполагаю, что один уже клонировал репо (например, 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.

Ответ 9

ниже - сделать команду 'git fetch' для извлечения всех запросов на получение при запуске "git fetch"

добавить ниже в ~/.gitconfig

[remote "origin"]
fetch = +refs/pull-requests/*/from:refs/remotes/origin/pr/*

Обратите внимание, что ссылка "refs/pull-requests/" имеет соглашение об именовании статов, для концентратора git вам может понадобиться другой формат

Ответ 10

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

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

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

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

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

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

Ответ 11

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

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

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

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

Ответ 12

Я нашел решение этой проблемы - вытащив изменения из неопубликованного PR на другой машине, я сделал следующие вещи на git bash 1. Вы, должно быть, взяли клон удаленного хранилища на компьютере 2 2. сделать git checkout (ветка, на которой был сгенерирован PR) 3. сделать мерзавец  и сделано !!!!!!!!!!!!!!