2013-02-19 25 views
66

Vorrei clonare un repository da GitHub. Il problema è che non voglio il ramo principale; Voglio la versione in this unapproved pull request.clone GitHub da richiesta pull?

È possibile clonare la versione richiesta di pull anziché il repository principale?

+2

Se non è venuto qui per 'clone' ma per' fetch' vedere: http://stackoverflow.com/questions/6743514/git-how-can-i- fetch-an-unmerged-pull-request-for-a-branch-i-dont-own –

+0

Sono venuto qui per clone. Grazie comunque. – Fresheyeball

risposta

50

È possibile clonare il ramo che si desidera utilizzando l'opzione -b nel comando git clone.

Nel tuo caso, il ramo che si desidera clonare è la filiale di origine della richiesta di pull (funzione/mangusta-support):

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

Grazie per avermi dato le caramelle dolci. Ottieni il controllo verde, ma upvotes per tutti quelli che hanno aiutato! – Fresheyeball

0

Quella richiesta di pull mostra il commit dalla forcella di quella persona in modo da poter vedere che sta spingendo le sue modifiche dal ramo feature/mongoose-support.

È possibile clonare il suo repository e checkout che si diramano

5

Quando un utente invia una richiesta di pull, che chiedono un po ' modifiche da unire da un ramo sul clone di un fork al repository di un altro utente.

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

+0

+1 per avere ragione – Fresheyeball

12

È possibile seguire le istruzioni in this gist per poter controllare direttamente il telecomando senza dover calcolare il repository e il ramo.

Esempio di utilizzo

Per uno dei miei progetti (github3.py) Ho il seguente nel mio github3.py/.git/config

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

La prima riga è ciò che è standard per ogni distanza con l'eccezione che github viene sostituito dal nome del telecomando. Ciò significa che le testate remote (o le diramazioni dei rami su quel server) sono "mappate" ai telecomandi locali con prefisso github/. Quindi, se avessi fatto git fetch github e avessi un ramo su GitHub che non era già stato notato localmente sulla mia macchina, avrebbe scaricato il ramo e avrei 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 dei rami git standard. Ecco perché vedi refs/pull/*/head. Cattura la testa di ogni richiesta pull su GitHub e la mappa su github/pr/#. Allora, se qualcuno invia una richiesta di pull ed è numerata 62 (per esempio), si farebbe:

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

E allora si sarebbe su un ramo locale chiamato pr/62 (ammesso che già non esiste). È bello e significa che non devi tenere traccia dei telecomandi o delle filiali di altre persone.

+0

non super utile – Fresheyeball

+1

Perché no? Spiega esattamente come farlo in un modo comodo ed efficiente. –

+0

Perché sono un noob e questo documento è difficile da capire. Non avrei mai ottenuto da "non farlo" a 'git clone https://github.com/berstend/frappe.git -b feature/mongoose-support/my_clone' dal documento gist. – Fresheyeball

61

Il modo più semplice per farlo è come questo:

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

Sarete ora su un nuovo ramo che si trova sulla stato della richiesta di pull.

+29

Migliore: 'git fetch origine pull/<#>/head: ' ([via] (https://coderwall.com/p/z5rkga)) – schlamar

+1

Mi sono trovato a fare riferimento a questa risposta SO spesso, quindi l'ho inserito in il mio file '.gitconfig' sotto' [alias] ':' pr = "! f() {git fetch $ 1 pull/$ 2/head: pull_ $ 2; git co pull_ $ 2;}; f" '. In questo modo scrivo semplicemente 'git pr upstream 62' e la prossima cosa che so, sono su un nuovo ramo del PR # 62 da upstream! Se usi sempre 'origin', puoi hardcode invece di' $ 1', ma questo cambia per me. –

+2

@matt --- più simile a https://gist.github.com/gnarf/5406589 – Chronial

2

Dopo aver installato git-extras

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

Si può semplicemente utilizzare git pr

$ git pr 62 [remote] 
+0

Mi piace, git-extras è davvero bello – Fresheyeball

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

esempio:

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

apportare le modifiche, impegnarli, PUSH e aprire il nuovo PR da il tuo per k su GitHub

+0

come posso unire questi rami localmente? Ho appena clonato e recuperato una richiesta pull non interrotta come sopra hai fatto. E ho provato il checkout branchname.Ma non appaiono modifiche nel mio IDE/editor di testo. – erginduran

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

How can I fetch an unmerged pull request for a branch I don't own?

+1

Nota 'git pull' crea un'unione nel ramo corrente; di solito per un PR ti basta "git fetch" per ottenere il codice dell'autore originale (è quindi accessibile come FETCH_HEAD). Se vuoi un'unione, vale la pena menzionare anche 'pull/2/merge' (invece di' pull/2/head') - questo fa sì che GitHub ti dia l'esatto commit di merge che accadrebbe se avessi fatto clic sul pulsante [Unisci] ora . –

Problemi correlati