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?
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
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?
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.
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
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
Consultez cet article d'aide de GitHub: https://help.github.com/articles/checking-out-pull-requests-locally
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'
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 add
vers 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.
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
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.
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
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 !!!!!!!!!!!!!!