2010-08-17 7 views
4

Je voudrais déterminer si un dépôt git distant (origine) contient une validation particulière. Mon cas d'utilisation est le suivant:Déterminer si un dépôt Git contient un commit particulier

Je me prépare à créer une version publique. Je veux inclure le SHA-1 du commit représentant la base de code vierge à partir de laquelle je construis la version.

Je veux également m'assurer que le commit n'est pas seulement un commit local, mais qu'il a en fait été poussé vers un dépôt central (origin).

Je pense

 

git pull --all & git branch --contains commit-hash 
 

, puis en examinant la sortie pour voir si elle contient la branche de suivi de la branche actuelle, fonctionne, mais semble assez lourde. Je cherche quelque chose d'un peu plus succinct comme git remote --contains origin commit-hash, ou git cat-file origin commit-hash. Je suppose qu'il doit y avoir une commande de plomberie que Git utilise pour déterminer quels objets doivent être transférés pendant une poussée ou une traction - je ne suis pas assez familier avec les internes.

Merci pour l'aide.

Répondre

5

Que diriez-vous: git fetch && git branch -r --contains <commit-id>

+1

hmmm ... J'avais négligé l'option -r. Cela fonctionnerait, mais je pense toujours qu'il doit y avoir une commande de plomberie qui me manque. Et vraiment, je me fiche que la branche de suivi de la branche actuelle contienne ou non la validation. Je me soucie juste que le commit existe en origine, sans tenir compte de la branche à partir de laquelle il est accessible. – Josh

+0

@Josh: Sûrement s'il s'agit d'une version publique, vous vous souciez de la branche sur laquelle elle se trouve - elle devrait être sur la branche pour cette version spécifique. – Cascabel

+0

Comme pour un script, il est préférable d'utiliser l'équivalent de plomberie: 'git merge-base --is-ancestor ' – JaviMerino

5

j'ai oublié une plomberie aussi, mais pour autant que je peux dire, la façon la plus directe pour tester si commitA est un ancêtre de commitB est de vérifier si git merge-base commitA commitB est commitA. Fetch d'abord, puis, car ils peuvent être branches, utiliser rev-parse pour obtenir une SHA1 pour commitA:

if [ "$(git rev-parse $commitA)" == "$(git merge-base $commitA $commitB)" ]; then ...; else ...; fi 

Wrap que dans un alias et vous devriez être défini. Comme pendant le push et le fetch (pull), ceux-ci sont implémentés en C, donc ils n'appellent pas directement les commandes de plomberie exposées.

0

git fetch + git branch -r est le meilleur que vous pourriez obtenir.

Vous pouvez pirater le git protocol pour donner ce résultat, mais il n'y a pas de plomberie, vous pouvez utiliser afaik. Voir la section 5 pour plus de détails. Juste pirater la commande "have" et vérifiez si le serveur NAK.

Un hack encore plus simple consiste simplement à pousser ce commit, voir si le serveur le veut.

0

peut-il être visible depuis la branche gerrit qui est en cours de révision mais qui n'a pas encore été fusionnée? après aller chercher, branche git --all --contains liste toutes les branches, mais, commits sur les pages de revue ne sont pas affichés.