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?


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

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.


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


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 = git@github.com: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.


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?


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).


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]


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


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.