Клон GitHub із запиту на виклик?


128

Я хотів би клонувати сховище з GitHub. Проблема в тому, що я не хочу головної галузі; Я хочу, щоб версія в цьому непідтвердженому запиті на виклик .

Чи можна мені клонувати версію запиту на витяг замість основного сховища?


2
Якщо ви прийшли сюди не для cloneале fetchдивіться: stackoverflow.com/questions/6743514 / ...
Чіро Сантіллі郝海东冠状病六四事件法轮功

Відповіді:


87

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

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

У вашому випадку гілка, яку ви хочете клонувати, є вихідною гілкою запиту pull ( 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>якщо ваш пульт дистанційного керування не названий origin.


49
Краще: git fetch origin pull/<#>/head:<local_branch_name>( via )
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
Чому ні? Це точно пояснює, як це зробити зручним та ефективним способом.
Ian Stapleton Cordasco

Тому що я ноб, і цей документ важко зрозуміти. Я ніколи б не потрапив від "не отримати його" до 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-адресу, з'ясовувати назву гілки тощо. Потім ви отримаєте добре названі, стислі та точні назви гілок без зайвих клопотів. Але я розумію, це може здатися непосильним.
Ian Stapleton Cordasco

О, гарно. Я не знав цього +1! Чи можете ви надати мені повністю кваліфікований приклад?
Fresheyeball

@ sigmavirus24 дякую за інформацію; Цікаво, чи існує подібний трюк для бітбукета?
Петро Козелка

8

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

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.