web-dev-qa-db-fra.com

Comment puis-je récupérer une demande d'extraction non fusionnée pour une branche que je ne possède pas?

Je dois extraire une demande d'extraction spécifique (qui n'a pas encore été traitée dans le flux principal) dans le référentiel NServiceBus:

https://github.com/johnsimons/NServiceBus/commit/d8524d53094e8181716e771c1023e968132abc15

Ce n'est évidemment pas mon rapport, mais j'ai besoin des modifications qui existent dans cette demande d'extraction.

Quelle est la meilleure façon de procéder?

59
user156888

Pour aller chercher un pull dans votre dépôt:

git fetch [email protected]:jboss/jboss-common-beans.git refs/pull/4/head

Alors faites ce que vous voulez avec FETCH_HEAD:

git checkout -b new-branch FETCH_HEAD
65
wolfc
git pull Origin pull/28/head

Ou

git fetch Origin pull/28/head:28
git checkout 28

Puis-je extraire une demande d'extraction non encore fusionnée?

52
Steven Penny

Tu peux le faire:

1) Ajoutez la télécommande en amont:

git remote add upstream [email protected]:Particular/NServiceBus.git

2) Après cela, vous pouvez extraire toute demande d'extraction vers une nouvelle succursale par son ID:

git fetch upstream pull/PULL_REQUEST_ID/head:NEW_BRANCH_NAME

Ensuite, vous aurez une branche nommée NEW_BRANCH_NAME contenant le code PR.

Ajouter un alias:

Si vous le faites aussi souvent que moi, vous voudrez peut-être configurer quelques alias pour cela .

[alias]
    fetch-pr = "!f(){\
        [ -z \"$1\" ] && { echo Usage: git fetch-pr PULL_REQUEST_ID [REMOTE_NAME] [NEW_BRANCH_NAME]; exit 1; }; \
        remote=${2:-Origin}; \
        branch=${3:-pr-$1}; \
        git fetch $remote \"pull/$1/head:$branch\"; \
        }; f "
    pr = "!f(){\
        branch=${3:-pr-$1}; \
        git fetch-pr \"$@\"; \
        git switch $branch; \
        }; f "

Avec ce qui précède, je peux faire:

git fetch-pr 123              # fetch PR #123 into branch pr-123
git fetch-pr 123 some-branch  # fetch PR #123 into some-branch
git pr 123                    # fetch and switch to the branch
17
elias

Pour les situations difficiles (surtout si vous n’avez pas un git-repo vérifié), je pense que le moyen le plus simple est d’appliquer un correctif. Pour cela, ouvrez simplement la demande de tir sur github et ajoutez un ".patch" à l'URL, téléchargez-le et appliquez le correctif.

Exemple:

cd cordova-plugin-media
wget https://github.com/Apache/cordova-plugin-media/pull/120.patch
patch -p1 < 120.patch
7
cat
5
David Phillips

github/hub

https://github.com/github/hub est un assistant CLI GitHub qui traite ce problème et d’autres cas d’utilisation avec des informations supplémentaires provenant de l’API GitHub. Par exemple.:

git clone https://github.com/github/hub
# Just copy paste the URL.
hub checkout https://github.com/github/hub/pull/970

Résultat:

  • nous sommes maintenant sur une branche appelée <USERID>-<BRANCH_NAME> qui contient le PR.

    Notez le bon nom de la branche qui a été automatiquement défini pour nous.

  • cette branche est configurée pour suivre la branche d'origine sur le fork, c'est-à-dire que .git/config contient:

    [branch "<USERID>-<BRANCH_NAME>"]
        remote = retronym
        merge = refs/heads/ticket/969
        rebase = true
    

    Donc, si des commits supplémentaires sont poussés, nous pouvons les git fetch directement.

L’installation de hub sur Linux est actuellement une tâche ardue si vous n’êtes pas familier avec Go, mais que vous en valez la peine. Sur Ubuntu 14.04, le Go sur les dépôts est trop ancien, donc GVM est la meilleure option:

bash < <(curl -LSs 'https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer')
. "$HOME/.gvm/scripts/gvm"
gvm install 'go1.4'
gvm use 'go1.4' --default
go get github.com/github/hub

J'ai également demandé à GitHub de nous fournir un aide-mémoire copier/coller sur l'interface utilisateur Web à l'adresse: https://github.com/isaacs/github/issues/449

Une fois que vous avez ajouté le référentiel en amont en tant que télécommande en amont (comme @elias l’a souligné):

$ git remote add upstream [email protected]:Particular/NServiceBus

Vous pouvez configurer git pour qu'il récupère les requêtes d'extraction par défaut:

$ git config --local --add remote.upstream.fetch '+refs/pull/*/head:refs/remotes/upstream/pr/*'

Alors allons le chercher:

$ git fetch upstream
Fetching upstream
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 2), reused 4 (delta 2), pack-reused 0
Unpacking objects: 100% (4/4), done.
From https://github.com/Particular/NServiceBus
 * [new ref]         refs/pull/1/head -> upstream/pr/1
 * [new ref]         refs/pull/2/head -> upstream/pr/2

Et vérifiez-le:

$ git checkout pr/2
Branch pr/2 set up to track remote branch pr/2 from upstream.
Switched to a new branch 'pr/2'
3
SummerBreeze

Voici les commandes qui ont fonctionné pour moi.

Je présume que quelqu'un a déjà cloné une prise en pension (par exemple pytorch ) sur son système localement. Après cela, un volontaire/enthousiaste a fourni du code et publié un PR pour le référentiel distant, mais il n'a pas encore été fusionné dans le maître ou dans une autre branche. Alors,

Nous devons d’abord fairegit remote addvers le dépôt distant de github:

# I've given the name `original`; you can give some other name as per your liking
$ git remote add original https://github.com/pytorch/pytorch

Ensuite, cd dans le référentiel pytorch et faites simplement:

# after this, the unmerged PR should be pulled to your local repo
$ git fetch original pull/<pull_number>/head    # 23, 123 etc.,

Maintenant, le PR en attente a été récupéré dans votre dépôt local et le bout de votre récupération serait dans FETCH_HEAD. Si vous souhaitez fusionner ce PR en attentelocalement, faites simplement:

$ git merge FETCH_HEAD

Après cela, si vous le faites:

$ git status

Vous devriez être en mesure de voir que le référentiel local est en avance sur les validations n faisant partie du PR en attente (c.-à-d. Qu'il est possible d'émettre plus d'un commit dans un seul PR). Le nombre de validations dépend donc des validations contenues dans le PR en attente.

0
kmario23

ci-dessous est de faire votre commande "git fetch" pour récupérer toutes les demandes de traction lorsque vous exécutez "git fetch"

ajouter ci-dessous dans ~/.gitconfig

[remote "Origin"]
fetch = +refs/pull-requests/*/from:refs/remotes/Origin/pr/*

notez que la référence "refs/pull-request /" a la convention de nommage des cachettes, pour git hub, vous aurez peut-être besoin d'un format différent

0
Minnie Shi

Github a un document clair pour la fusion de la demande d'extraction dans un local repo:

https://help.github.com/fr/articles/checking-out-pull-requests-locally

Cela revient à savoir qu'une demande d'extraction dans GitHub est simplement une branche du référentiel de base où le nom de la branche est un numéro de séquence. L'article ci-dessus vous explique comment trouver ce numéro et la magie de la ligne de commande git pour le récupérer dans votre dépôt local avec le nom de branche souhaité.

Je ne pouvais pas trouver un moyen aussi simple de fusionner la demande d'extraction dans une branche que j'ai créée sur GitHub.

0
BobHy

Si vous souhaitez simplement ajouter une demande d'extraction non fusionnée provenant d'un autre référentiel à votre propre, Toutes les complications ne sont pas nécessaires (comme le montrent généralement d'autres réponses).

Au lieu de cela, allez simplement dans votre propre dépôt et récupérez le commit (depuis la source PR), en utilisant son hash de commit.

git pull https://bitbucket.org/SomeUser/SomeProjectRepo/commits/c15...db2

En procédant de cette façon, vous aurez juste un tas de nouveaux fichiers édités, comme si vous les aviez eux-mêmes édités. C’est ensuite à vous de décider si vous voulez commettre ceux-ci avec un tag/label.

Si vous souhaitez ensuite transmettre toutes les nouvelles à votre propre dépôt GitHub, faites comme d'habitude: 

git commit -m "Added something by Anonymous"
git Push -u Origin master
0
not2qubit

J'ai trouvé cette solution à ce problème - en tirant les modifications de relations publiques non fusionnées sur une machine différente, j'ai ensuite procédé comme suit sur git bash 1. Vous devez avoir pris le clone d'un référentiel distant sur la machine 2 2. Faites git checkout (branche sur laquelle le rapport PR a été généré) 3. fais git pull et fait !!!!!!!!!!!!!!

0
Waaheeda