Un projet sur GitHub dont j'ai une fourche a une nouvelle demande de traction que je veux insérer dans ma fourche que l'auteur n'a pas encore intégrée.
Existe-t-il un moyen simple d'appliquer la demande d'extraction d'autres fourches dans ma fourche? Y a-t-il autre chose ici qui me manque?
Vous pouvez le faire manuellement assez facilement:
ajoutez l'autre fork comme télécommande de votre repo:
git remote add otherfork git://github.com/request-author/project.git
aller chercher les engagements de son repo
git fetch otherfork
Vous avez alors deux options pour appliquer la demande de tirage (si vous ne voulez pas choisir le choix 1.)
Si vous ne vous souciez pas d'appliquer également les éventuels commits qui ont été ajoutés entre l'origine et la demande d'extraction, vous pouvez simplement rebaser la branche sur laquelle la demande d'extraction a été formée.
git rebase master otherfork/pullrequest-branch
Si vous ne voulez que les commits dans la demande d'extraction, identifiez leur SHA1 et faites-le.
git cherry-pick <first-SHA1> <second-SHA1> <etc.>
Vous pouvez également le faire via la page Web github.
Je suppose que vous devriez déjà avoir un fork (MyFork
) du référentiel commun (BaseRepo
) qui contient la demande d'extraction en attente d'un fork (OtherFork
) qui vous intéresse.
OtherFork
) qui a initié la demande de tirage que vous souhaitez introduire dans votre fork (MyFork
)OtherFork
OtherFork
appropriée. Sélectionnez sur le côté gauche la base de votre fourche pour votre fourche (MyFork
) (IMPORTANT).View pull request
devrait être remplacée par Create pull request
. Cliquez ici.Vous devez maintenant avoir une demande de retrait en attente dans votre fork (MyFork
), que vous pouvez simplement accepter.
Comme Tekkub l'a dit précédemment, vous pouvez simplement tirer la branche directement. La plupart du temps, avec GitHub, la branche est simplement "maîtresse" du fork de l'utilisateur demandeur du projet.
Exemple: git pull https://github.com/USER/PROJECT/ BRANCH
Quelques informations plus détaillées qui ont fonctionné pour moi.
Mon fichier .git/config pour le repo forké ressemble à ceci:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = false
[remote "Origin"]
url = [email protected]:litzinger/angular-carousel.git
fetch = +refs/heads/*:refs/remotes/Origin/*
[branch "master"]
remote = Origin
merge = refs/heads/master
rebase = true
[remote "source"]
url = git://github.com/revolunet/angular-carousel.git
fetch = +refs/heads/*:refs/remotes/source/*
fetch = +refs/pull/*/head:refs/remotes/Origin/pr/*
Puis lancez "git fetch source", qui répertorie ensuite toutes les demandes d'extraction du référentiel forké.
* [new ref] refs/pull/54/head -> Origin/pr/54
* [new ref] refs/pull/67/head -> Origin/pr/67
* [new ref] refs/pull/69/head -> Origin/pr/69
* [new ref] refs/pull/71/head -> Origin/pr/71
Et ensuite, pour fusionner dans une demande de tir spécifique, exécutez "git merge master Origin/pr/67"
Les demandes d'extraction pour le projet peuvent provenir de nombreux auteurs (forks), et vous ne souhaiterez probablement pas une télécommande distincte pour chaque fork. En outre, vous ne voulez pas émettre d'hypothèses sur la branche utilisée par l'auteur lors de la soumission de la demande d'extraction, ni sur ce qui pourrait se trouver dans la branche principale de l'auteur. Il est donc préférable de référencer la demande d'extraction telle qu'elle apparaît dans le référentiel en amont plutôt que telle qu'elle apparaît dans les autres fourches.
Étape 1:
git remote add upstream <url>
Vous avez probablement déjà effectué cette étape, mais si vous ne le faites pas, vous souhaiterez une définition distante pour le projet en amont. L'URL est l'URL de clone du projet que vous avez créé. Plus d'infos sur Configuration d'une télécommande pour un fork et Synchroniser un fork . upstream
est le nom que vous donnez à la télécommande. Bien que cela puisse être n'importe quoi, upstream
est le nom conventionnel.
Étape 2:
git pull upstream refs/pull/{id}/head
... où {id}
est le numéro de la demande d'extraction. upstream
est le nom de la télécommande à utiliser, c'est-à-dire "en amont" si vous avez suivi l'étape 1 exactement. Il peut également s'agir d'une URL, auquel cas vous pouvez ignorer l'étape 1.
Étape 3:
Tapez un message de validation pour la validation de fusion. Vous pouvez conserver la valeur par défaut, bien que je recommande de fournir un résumé Nice en une ligne avec le numéro de demande d'extraction, le problème qu'il corrige et une brève description:
Merge PR#42, fixing VIM-652, support for mapping arbitrary IDEA actions
Ce que je ferais est la suivante.
git checkout master
git remote add #NAME# #ADDRESS TO REPO#
git fetch #USERNAME#
git checkout -b test_fork
git rebase #NAME#/#BRANCH#
J'ai maintenant fusionné les modifications dans une branche de test, nommée test_fork
. Pour que les changements ne salissent pas mon arbre.
Vous pouvez éventuellement utiliser le choix de recherche comme décrit ci-dessus pour choisir un commit particulier si cela est préférable.
Bon voyage :)
J'utilise un script dandy pratique pour cela. Je lance le script en tapant:
git prfetch upstream
et il obtient toutes les demandes d'extraction de la fourche en amont.
Pour créer le script, créez un fichier ~/bin/git-prfetch
.
Le fichier doit contenir les éléments suivants:
#!/bin/bash
if [ -z "$1" ]; then
echo "Please supply the name of a remote to get pull requests from."
exit 1
fi
git fetch $1 +refs/heads/\*:refs/remotes/$1/\* +refs/pull/\*/head:refs/remotes/$1/pr/\*
Assurez-vous que votre chemin inclut le script en définissant:
export PATH="$HOME/bin:$PATH"
Vous pouvez ajouter ce fichier à ~/.bashrc
pour rendre la modification permanente.
Maintenant, assurez-vous d’ajouter la fourche à partir de laquelle vous voulez obtenir les demandes de tirage:
git remote add upstream https://github.com/user/repo.git
Puis
git prfetch upstream