Как я могу получить незаполненный пул-запрос для ветки, которой я не владею?
Мне нужно получить конкретный запрос на извлечение (который еще не был обработан в основной поток) в репозитории NServiceBus:
https://github.com/johnsimons/NServiceBus/commit/d8524d53094e8181716e771c1023e968132abc15
Это, очевидно, не мое репо, но мне нужны изменения, которые существуют в этом запросе.
Каков наилучший способ сделать это?
9 ответов
git pull origin pull/28/head
Или же
git fetch origin pull/28/head:28
git checkout 28
Чтобы получить тягу в ваш репозиторий:
git fetch git@github.com:jboss/jboss-common-beans.git refs/pull/4/head
Затем делайте что хотите с FETCH_HEAD:
git checkout -b new-branch FETCH_HEAD
Вы можете сделать это:
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
Для сложных ситуаций (особенно если у вас нет проверенного 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
Смотрите эту справочную статью от GitHub: https://help.github.com/articles/checking-out-pull-requests-locally
GitHub / концентратору
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>
который содержит пиар.Обратите внимание на хорошее название ветки, которое было автоматически установлено для нас.
эта ветка установлена для отслеживания оригинальной ветки на вилке, т.е.
.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
Как только вы добавили репозиторий в восходящем направлении как удаленный в апстриме (как указывал @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'
Вот команды, которые работали для меня.
Я предполагаю, что один уже клонировал репо (например, 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.
Это решение из документов GitHub:
В репозитории проекта откройте новую ветку и проверьте изменения.
git checkout -b GithubUserID-branchName branchName
git pull https://github.com/GithubUserID/reponame.git branchName
Куда:
GithubUserID
- имя пользователя, открывшего запрос на перенос.branchName
это название ветки например masterreponame
имя репозитория, например demo-todo
Пример:
git checkout -b felix123-master master
git pull https://github.com/felix123/demo-todo.git master
Если вы просто хотите добавить один необработанный запрос на извлечение из какого-либо другого репозитория, вам не нужно будет никаких сложностей (как в основном показано в других ответах).
Вместо этого просто зайдите в свой репозиторий и извлеките коммит (из PR-источника), используя его хэш коммита.
git pull https://bitbucket.org/SomeUser/SomeProjectRepo/commits/c15...db2
Делая это таким образом, у вас просто будет куча новых отредактированных файлов, как если бы вы редактировали их самостоятельно. Тогда вам решать, хотите ли вы зафиксировать их с помощью какого-либо тега / метки.
Если вы хотите отправить все новости в свое репозиторий GitHub, просто сделайте как всегда:
git commit -m "Added something by Anonymous"
git push -u origin master
Ниже приведена команда 'git fetch' для получения всех запросов извлечения при запуске "git fetch"
добавить ниже в ~/.gitconfig
[remote "origin"]
fetch = +refs/pull-requests/*/from:refs/remotes/origin/pr/*
обратите внимание, что ссылка "refs/pull-запросы /" имеет соглашение о присвоении имен в stash, для git hub вам может понадобиться другой формат
У Github есть понятный документ для объединения запроса извлечения в локальный репозиторий:
https://help.github.com/en/articles/checking-out-pull-requests-locally
Это сводится к знанию, что пул-запрос в GitHub - это просто ветвь в базовом репо, где имя ветки представляет собой порядковый номер. В приведенной выше статье показано, как найти это число и магию командной строки git, чтобы перетащить его в локальный репозиторий с любым именем ветви, которое вы захотите.
Я не мог найти такой же простой способ объединить запрос на получение в форк, который я создал на GitHub.
Я нашел решение этой проблемы - извлекая изменения из несвязанного PR на другой машине, я сделал следующее на git bash 1. Вы должны были взять клон удаленного репозитория на машине 2 2. выполнить git checkout (ветка, на которой был создан PR) 3. Сделайте git pull и готово!!!!!!!!!!!!!!