Клон GitHub из запроса на перенос?


128

Я хочу клонировать репозиторий с GitHub. Проблема в том, что мне не нужна основная ветка; Мне нужна версия в этом неутвержденном запросе на перенос .

Могу ли я клонировать версию запроса на перенос вместо основного репозитория?


2
Если вы приехали сюда не для того, cloneа для того, чтобы fetchпосмотреть: stackoverflow.com/questions/6743514/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Ответы:


87

Вы можете клонировать нужную ветку, используя -bопцию и запрос на вытягивание:

git clone https://github.com/user_name/repo_name.git -b feature/pull_request_name dir_name

В вашем случае ветка, которую вы хотите клонировать, является исходной ветвью запроса на перенос ( feature/mongoose-support):

git clone https://github.com/berstend/frappe.git -b feature/mongoose-support ./mongoose-support

112

Самый простой способ сделать это так:

git fetch origin pull/2/head
git checkout -b pullrequest FETCH_HEAD

Теперь вы будете в новой ветке, которая находится в состоянии запроса на перенос.

Вы можете настроить псевдоним, запустив

git config --global alias.pro '!f() { git fetch -fu ${2:-origin} refs/pull/$1/head:pr/$1 && git checkout pr/$1; }; f'

Теперь вы можете проверить любой PR, запустив его git pr <pr_number>, или git pr <pr_number> <remote>если ваш пульт github не назван origin.


49
Лучше: git fetch origin pull/<#>/head:<local_branch_name>( через )
schlamar

5
Я обнаружил , что ссылки на этот SO ответ часто, так что я застрял это в мой .gitconfigфайл под [alias]: pr = "!f() { git fetch $1 pull/$2/head:pull_$2; git co pull_$2; }; f". Таким образом, я просто git pr upstream 62печатаю, и следующее, что я знаю, я нахожусь в новой ветви PR # 62 от апстрима! Если вы всегда используете, originвы можете жестко запрограммировать его вместо $1, но это меняет меня.
---

@matt, который предполагает, что у вас есть псевдоним для co
Майкл

43
git fetch origin refs/pull/PR_NUMBER/head:NEW_LOCAL_BRANCH

например:

$ git fetch origin pull/611/head:pull_611
$ git checkout pull_611

Внесите изменения, зафиксируйте их, НАЖМИТЕ и откройте новый PR из вашей вилки на GitHub


как я могу объединить эти ветки локально? Я только что клонировал и получил не объединенный запрос на перенос, как вы это сделали. И попробовал название ветви оформления, но в моей IDE / текстовом редакторе никаких изменений не появилось.
erginduran

17

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

Пример использования

Для одного из моих проектов (github3.py) у меня в моем github3.py/.git/config

[remote "github"]
    fetch = +refs/heads/*:refs/remotes/github/*
    fetch = +refs/pull/*/head:refs/remotes/github/pr/*
    url = git@github.com:sigmavirus24/github3.py

Первая строка - это то, что стандартно для каждого пульта, за исключением того, что githubзаменяется именем пульта. Это означает, что удаленные головы (или главы ветвей на этом сервере) «отображаются» на локальные пульты с префиксом github/. Так что, если я git fetch githubи имел филиал на GitHub , что не было уже заметили , локально на моей машине, было бы загрузить ветку , и я мог бы переключиться на него так: git checkout -t github/branch_name.

Вторая строка делает то же самое, но делает это для запросов на вытягивание вместо стандартных веток git. Вот почему вы видите refs/pull/*/head. Он извлекает заголовок каждого запроса на перенос на GitHub и сопоставляет его github/pr/#. Итак, если кто-то отправляет запрос на перенос, и он имеет номер 62 (например), вы должны сделать:

git fetch github
git checkout -t github/pr/62

И тогда вы будете в локальной ветке с именем pr/62(при условии, что она еще не существует). Это приятно и означает, что вам не нужно отслеживать чужие пульты или ветки.


2
Почему нет? В нем объясняется, как это сделать удобным и эффективным способом.
Ян Стэплтон Кордаско

Потому что я новичок, и этот документ трудно понять. Я бы никогда не получил от " git clone https://github.com/berstend/frappe.git -b feature/mongoose-support /my_cloneнепонятного" документа по сути.
Fresheyeball

6
Что делает основной документ, так это добавляет дополнительный набор информации (ссылки или ссылки) для извлечения из GitHub. Когда вы это сделаете, git fetch githubвы сможете git co -t github/pr/#. Это избавляет вас от необходимости копировать и вставлять удаленный URL-адрес, вычислять имя ветки и т. Д. Вы получаете хорошо названные, лаконичные и точные имена веток без дополнительных хлопот. Но я понимаю, что это может показаться ошеломляющим.
Ян Стэплтон Кордаско

О, классно. Я этого +1 не знал! Вы можете дать мне полный пример?
Fresheyeball

@ sigmavirus24 большое спасибо за информацию; Интересно, существует ли подобный трюк для битбакета?
Петр Козелка

8

1
Note git pullсоздает слияние с текущей веткой; обычно для PR вам нужно просто git fetchполучить оригинальный авторский код (тогда он доступен как FETCH_HEAD). Если вы действительно хотите слияние, стоит также упомянуть pull/2/merge(вместо pull/2/head) - это заставляет GitHub предоставить вам точную фиксацию слияния, которая произойдет, если вы сейчас нажмете кнопку [Merge].
Бени Чернявский-Паскин

6

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

Желаемые изменения можно получить из источника запроса на перенос. Для этого клонируйте репозиторий пользователя ( git://github.com/berstend/frappe.git), а затем проверьте ветку, из которой он создал запрос на перенос ( feature/mongoose-support).


1

После установки git-extras

(cd /tmp && git clone --depth 1 https://github.com/tj/git-extras.git && cd git-extras && sudo make install)

Вы можете просто использовать git pr

$ git pr 62 [remote]


0

Этот запрос на перенос показывает коммиты из вилки этого человека, поэтому вы можете видеть, что он отправляет свои изменения из feature/mongoose-supportветки.

Вы можете клонировать его репозиторий и проверить эту ветку


0

Для меня это было так просто, как

git fetch origin pull/4/head

Где 4здесь нашли:

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.