Clone di GitHub dalla richiesta pull?


Risposte:


87

Puoi clonare il ramo che desideri utilizzando l' -bopzione e per la richiesta pull:

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

Nel tuo caso, il ramo che vuoi clonare è il ramo sorgente della richiesta pull ( feature/mongoose-support):

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

112

Il modo più semplice per farlo è così:

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

Ti troverai ora su un nuovo ramo che si trova nello stato della richiesta pull.

Potresti voler impostare un alias eseguendo

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

Ora puoi eseguire il checkout di qualsiasi PR eseguendolo git pr <pr_number>o git pr <pr_number> <remote>se il tuo telecomando GitHub non è denominato origin.


49
Meglio: git fetch origin pull/<#>/head:<local_branch_name>( via )
schlamar

5
Mi sono trovato riferimento a questa risposta così spesso, quindi ho attaccato questo nel mio .gitconfigfile in [alias]: pr = "!f() { git fetch $1 pull/$2/head:pull_$2; git co pull_$2; }; f". In questo modo digito git pr upstream 62e la prossima cosa che so, sono su un nuovo ramo di PR # 62 da monte! Se lo usi sempre originpuoi codificarlo come hardcoded invece di $1, ma per me cambia.
matt ---

@ matt che presume che tu abbia un alias per il checkout denominatoco
Michael McQuade,

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

per esempio:

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

Apporta modifiche, esegui il commit, PUSH e apri un nuovo PR dal fork su GitHub


come posso unire questi rami localmente? Ho appena clonato e recuperato una richiesta pull non unita come hai fatto sopra e ho provato a eseguire il checkout branchname.Ma nessuna modifica appare nel mio IDE / editor di testo.
erginduran

17

È possibile seguire le indicazioni in questa sintesi per poter controllare direttamente il telecomando senza dover capire il loro repository e ramo.

Utilizzo di esempio

Per uno dei miei progetti (github3.py) ho quanto segue nel mio file 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

La prima riga è ciò che è standard per ogni telecomando con l'eccezione che githubviene sostituita dal nome del telecomando. Ciò significa che le testine remote (o le testate dei rami su quel server) sono "mappate" su telecomandi locali preceduti da github/. Quindi, se ho fatto git fetch githube ha avuto un ramo su GitHub che non è stato già notato a livello locale sulla mia macchina, sarebbe scaricare il ramo e ho potuto passare ad esso in questo modo: git checkout -t github/branch_name.

La seconda riga fa la stessa cosa, ma lo fa per le richieste pull invece che per i rami git standard. Ecco perché vedi refs/pull/*/head. Recupera l'intestazione di ogni richiesta pull su GitHub e la mappa a github/pr/#. Quindi, se qualcuno invia una richiesta di pull ed è numerata 62 (ad esempio), faresti:

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

E poi saresti su un ramo locale chiamato pr/62(supponendo che non esistesse già). È carino e significa che non devi tenere traccia dei telecomandi o dei rami di altre persone.


2
Perchè no? Spiega esattamente come farlo in modo conveniente ed efficiente.
Ian Stapleton Cordasco

Perché sono un noob e quel documento è difficile da capire. Non sarei mai arrivato dal "non averlo ricevuto" git clone https://github.com/berstend/frappe.git -b feature/mongoose-support /my_clonedal documento essenziale.
Fresheyeball

6
Quello che fa il documento gist è aggiungere un ulteriore set di informazioni (ref o riferimenti) da recuperare da GitHub. Quando lo fai git fetch github, puoi farlo git co -t github/pr/#. Questo ti impedisce di dover copiare e incollare l'URL remoto, capire il nome del ramo, ecc. Quindi ottieni nomi di ramo ben denominati, concisi e accurati senza problemi aggiuntivi. Ma capisco che possa sembrare opprimente.
Ian Stapleton Cordasco

Oh bello. Non conoscevo questo +1! Puoi farmi un esempio completo?
Fresheyeball

@ sigmavirus24 grazie mille per l'informazione; Mi chiedo se esiste un trucco simile per bitbucket?
Petr Kozelka

8
git clone git://github.com/dweldon/frappe
cd frappe
git pull origin pull/2/head

Come posso recuperare una richiesta pull non unita per un ramo che non possiedo?


1
Nota git pullcrea una fusione nel ramo corrente; di solito per un PR vorresti solo git fetchottenere il codice dell'autore originale (è quindi accessibile come FETCH_HEAD). Se vuoi un'unione, vale anche la pena menzionarla pull/2/merge(invece di pull/2/head) - questo fa sì che GitHub ti dia l'esatto commit di unione che avverrebbe se facessi clic sul pulsante [Unisci] ora.
Beni Cherniavsky-Paskin

6

Quando un utente invia una richiesta pull, chiede che alcune modifiche vengano unite da un ramo sul proprio clone di un fork al repository di un altro utente.

Le modifiche desiderate possono essere ottenute dall'origine della richiesta pull. Per fare ciò, clona il repository dell'utente ( git://github.com/berstend/frappe.git), quindi controlla il ramo da cui ha creato la richiesta pull ( feature/mongoose-support).


1

Dopo aver installato git-extras

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

Puoi semplicemente usare git pr

$ git pr 62 [remote]


0

Quella richiesta pull mostra i commit dal fork di quella persona in modo che tu possa vedere che sta spingendo le sue modifiche dal feature/mongoose-supportramo.

Puoi clonare il suo repository e controllare quel ramo


0

Per me è stato semplice come

git fetch origin pull/4/head

Dove è 4stato trovato qui:

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.