Récemment, j'ai créé un PR sur GitHub, mais certains tests ont échoué. Et localement, encore plus de tests n'ont pas réussi. J'ai donc essayé de comprendre quel était le problème.
Et ce que j'ai découvert, c'est que Travis testait le dépôt étant à autre commit Je n'ai pas. La référence est refs/pull/81/merge. Donc, quelqu'un aurait fusionné ma branche dans le maître et créé la référence correspondante. Était-ce GitHub ou Travis?
Et l'autre question, puis-je lister toutes les références du repo GitHub?
Je ne sais rien de Travis lui-même, mais GitHub crée en fait ces refs/pull/number/merge
réfs. En particulier, basé sur l'observation - la documentation semble un peu maigre et je ne suis qu'un utilisateur quelque peu décontracté de GitHub - lorsque vous cliquez sur "nouvelle demande d'extraction" dans GitHub, GitHub:
refs/pull/number/head
pour enregistrer l'ID du commit que vous demandez à quelqu'un d'autre de fusionner pour vous;git merge
) et si cela réussit , crée une deuxième référence nommée refs/pull/number/merge
.Notez que ce commit de fusion créé automatiquement n'est sur aucune branche , il a simplement le même numéro de demande d'extraction attribué, et une référence dont le nom est évident depuis la pull-request elle-même (remplacez simplement head
par merge
). Je crois - mais je n'ai pas testé manuellement - que le premier parent de cette fusion est le commit de la branche sur laquelle vous demandez à quelqu'un d'être "activé" lorsque il faire la même fusion, c'est-à-dire le code dans les coulisses qui crée ce refs/pull/number/merge
la référence est (ou est assez proche de):
commithash=... # the commit ID for the pull-request
mergeinto=$(git rev-parse $branchname) # the branch we are to merge into
prnum=... # get next pull request number
# create the pull request itself
git update-ref refs/pull/$prnum/pull $commithash
# create the merge ref, if the merge succeeds
git checkout $mergeinto
if git merge -m "..." refs/pull/$prnum/pull; then
# merge succeeded: create the merge ref
git update-ref refs/pull/$prnum/merge HEAD
else
# automatic merge failed, discard it
git merge --abort
fi
(cette séquence de code particulière perturbe l'index et laisse HEAD
détaché, donc cela doit être fait avec le référentiel verrouillé et le nettoyage post-travail, ou en utilisant un arbre de travail temporaire; la séquence de code réelle est probablement différent pour un certain nombre de raisons).
Par conséquent:
Donc, quelqu'un aurait fusionné ma branche dans le maître et créé la référence correspondante. Était-ce GitHub ou Travis?
Étant donné que GitHub le fera , Guillaume d'Ockham suggère qu'il n'est pas nécessaire d'invoquer Travis. :-)
Et l'autre question, puis-je répertorier toutes les références du référentiel GitHub?
Tant que vous avez accès:
$ git ls-remote
(en supposant que la télécommande est une URL GitHub) affichera toutes les références exposées. Je n'ai pas vu de moyen d'interface Web pour le faire, ni trouvé un dans ma (légère) lecture de la documentation de l'API GitHub.
Si vous voulez juste une liste de toutes les références dans votre référentiel, vous pouvez exécuter:
git show-ref
Cela imprimera le <SHA> <NAME>
de chaque référence sous .git/refs/*
Une réponse mentionne git ls-remote
- alors que cela fonctionne en général pour mon cas d'utilisation, j'avais besoin de lister ce que git pense la télécommande a - par ex. lorsque l'administrateur du serveur nettoie mes référentiels distants périmés et que je souhaite les restaurer à l'aide de mes clones git locaux.
Pour répertorier toutes les références distantes connues que j'avais l'habitude d'utiliser ls .git/refs/remotes/<name>/
- se révèle dans certains cas ce n'est pas suffisant, ex sur un git-p4
le référentiel une des références de ma télécommande était seulement répertorié dans .git/packed-refs
.
En utilisant git branch -r
fonctionnerait mais la sortie n'est pas proprement analysable et nécessite la grep'ing des références distantes désirées.
Après avoir creusé un peu, j'ai fini par utiliser git for-each-ref
:
git for-each-ref --format="%(refname)" refs/remotes/<name>/
NB: git show-refs
peut également répertorier les références, mais le modèle est ancré à la fin du nom complet de la référence et seuls les composants complets sont mis en correspondance. Je voulais quelque chose de bien rangé qui s'intègre bien dans un oneliner.