Cloner GitHub à partir d'une demande d'extraction?

128

Je voudrais cloner un référentiel depuis GitHub. Le problème est que je ne veux pas de la branche principale; Je veux la version dans cette demande d'extraction non approuvée .

Est-il possible pour moi de cloner la version pull request au lieu du référentiel principal?

Fresheyeball
la source
2
Si vous êtes venu ici non pas pour clonemais pour fetchvoir: stackoverflow.com/questions/6743514/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

87

Vous pouvez cloner la branche de votre -bchoix en utilisant l' option et pour pull request:

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

Dans votre cas, la branche que vous souhaitez cloner est la branche source de la pull request ( feature/mongoose-support):

git clone https://github.com/berstend/frappe.git -b feature/mongoose-support ./mongoose-support
inancsevinc
la source
112

La façon la plus simple de le faire est la suivante:

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

Vous allez maintenant être sur une nouvelle branche qui est sur l'état de la pull request.

Vous souhaiterez peut-être configurer un alias en exécutant

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

Vous pouvez maintenant vérifier n'importe quel PR en exécutant git pr <pr_number>, ou git pr <pr_number> <remote>si votre télécommande github n'est pas nommée origin.

Chroniques
la source
49
Mieux: git fetch origin pull/<#>/head:<local_branch_name>( via )
schlamar
5
Je me suis trouvé faisant référence à cette réponse si souvent, alors je coincé ceci dans mon .gitconfigfichier sous [alias]: pr = "!f() { git fetch $1 pull/$2/head:pull_$2; git co pull_$2; }; f". De cette façon, je viens de taper git pr upstream 62et la prochaine chose que je sais, je suis sur une nouvelle branche de PR # 62 en amont! Si vous utilisez toujours, originvous pouvez le coder en dur au lieu du $1, mais cela change pour moi.
mat ---
@matt qui suppose que vous avez un alias pour le paiement nomméco
Michael McQuade
43
git fetch origin refs/pull/PR_NUMBER/head:NEW_LOCAL_BRANCH

par exemple:

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

Apportez des modifications, validez-les, PUSH et ouvrez un nouveau PR à partir de votre fourchette sur GitHub

wierzbiks
la source
comment puis-je fusionner ces branches localement? Je viens de cloner et de récupérer une demande d'extraction non fusionnée comme ci-dessus.Et j'ai essayé de vérifier le nom de branche.Mais aucun changement n'apparaît dans mon IDE / éditeur de texte.
erginduran
17

Vous pouvez suivre les instructions de cet article pour pouvoir extraire directement la télécommande sans avoir à déterminer leur référentiel et leur branche.

Exemple d'utilisation

Pour l'un de mes projets (github3.py), j'ai ce qui suit dans mon 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 première ligne est ce qui est standard pour chaque télécommande à l'exception qui githubest remplacée par le nom de la télécommande. Cela signifie que les têtes distantes (ou les têtes de succursales sur ce serveur) sont "mappées" sur les télécommandes locales précédées du préfixe github/. Donc , si je l' ai fait git fetch githubet avait une branche sur GitHub qui n'a pas été déjà remarqué localement sur ma machine, il téléchargeait la branche et je pourrais passer à comme ceci: git checkout -t github/branch_name.

La deuxième ligne fait la même chose, mais elle le fait pour les requêtes d'extraction au lieu des branches git standard. Voilà pourquoi vous voyez refs/pull/*/head. Il récupère la tête de chaque pull request sur GitHub et la mappe vers github/pr/#. Donc, si quelqu'un envoie une pull request et qu'elle porte le numéro 62 (par exemple), vous feriez:

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

Et puis vous seriez sur une branche locale appelée pr/62(en supposant qu'elle n'existait pas déjà). C'est bien et cela signifie que vous n'avez pas à garder une trace des télécommandes ou des succursales des autres.

Ian Stapleton Cordasco
la source
2
Pourquoi pas? Il explique exactement comment procéder de manière pratique et efficace.
Ian Stapleton Cordasco
Parce que je suis un noob, et ce document est difficile à comprendre. Je n'aurais jamais obtenu de "ne pas l'obtenir" à git clone https://github.com/berstend/frappe.git -b feature/mongoose-support /my_clonepartir du document essentiel.
Fresheyeball
6
Ce que fait le document essentiel est d'ajouter un ensemble supplémentaire d'informations (références ou références) à extraire de GitHub. Lorsque vous le faites, git fetch githubvous pouvez le faire git co -t github/pr/#. Cela vous évite d'avoir à copier et coller l'URL distante, à trouver le nom de la branche, etc. Vous obtenez alors des noms de branche bien nommés, concis et précis sans tracas supplémentaire. Mais je comprends que cela peut sembler accablant.
Ian Stapleton Cordasco
Oh sympa. Je ne savais pas ce +1! Pouvez-vous me donner un exemple pleinement qualifié?
Fresheyeball
@ sigmavirus24 merci beaucoup pour l'information; Je me demande si une astuce similaire existe pour bitbucket?
Petr Kozelka
8
git clone git://github.com/dweldon/frappe
cd frappe
git pull origin pull/2/head

Comment puis-je récupérer une pull request non fusionnée pour une branche que je ne possède pas?

Steven Penny
la source
1
Remarque git pullcrée une fusion dans la branche actuelle; généralement pour un PR, vous voudriez simplement git fetchobtenir le code de l'auteur original (il est alors accessible en tant que FETCH_HEAD). Si vous voulez une fusion, cela vaut également la peine de mentionner pull/2/merge(au lieu de pull/2/head) - cela fait que GitHub vous donne le commit de fusion exact qui se produirait si vous cliquiez maintenant sur le bouton [Fusionner].
Beni Cherniavsky-Paskin
6

Lorsqu'un utilisateur soumet une pull request, il demande que certaines modifications soient fusionnées à partir d'une branche sur son clone d'un fork vers le référentiel d'un autre utilisateur.

Les modifications souhaitées peuvent être obtenues à partir de la source de la demande d'extraction. Pour ce faire, clonez le référentiel de l'utilisateur ( git://github.com/berstend/frappe.git), puis extrayez la branche à partir de laquelle il a créé la demande d'extraction ( feature/mongoose-support).

Adrianbanks
la source
1

Après avoir installé git-extras

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

Vous pouvez simplement utiliser git pr

$ git pr 62 [remote]
mégawac
la source
0

Cette demande d'extraction montre les validations de la fourchette de cette personne afin que vous puissiez voir qu'il pousse ses modifications depuis la feature/mongoose-supportbranche.

Vous pouvez cloner son référentiel et récupérer cette branche

Kartik
la source
0

Pour moi, c'était aussi simple que

git fetch origin pull/4/head

Où a 4été trouvé ici:

entrez la description de l'image ici

stevec
la source