2010-03-28 5 views
2

Je veux être capable de passer n'importe quoi à une commande git (peut-être c'est un SHA, peut-être juste quelque chose comme "origin/master" ou "devel/epxerimental" etc.) et git me dit le chemin ref de la branche le quelque chose vécu, par exempleComment puis-je obtenir le chemin ref associé pour un SHA git?

<git_command> 0dc27819b8e9 => output: refs/heads/master 
<git_command> xyz/test => output: refs/remotes/xyz/master 
... 

J'ai regardé git show ou git log ou git rev-parse et en dehors de --pretty=format:%d je ne pouvais pas trouver quoi que ce soit. (--pretty=format:%d sortie est assez étrange avec beaucoup d'espace libre et des lignes vides et parfois plus d'un ref chemins sont sur une ligne groupée ensemble).

Il doit y avoir un meilleur moyen?

Merci d'avoir lu.

Andre

Répondre

5

Il n'y a pas d'information fixe qui enregistrerait une telle données, car SHA1 ne sont pas associés à tout moment avec un chemin réf.
Les branches peuvent se déplace, renommer ou supprimer, alors que le SHA1 sera toujours stocké (sauf si elle est référencé par aucun motif ref, il finira par être élaguée)

Cela dit:

git show-ref |grep yourSHA1|awk "{print $2}" 
git show-ref --heads --tags -d |grep yourSHA1|awk "{print $2}" 

est assez proche de ce que veulent yout:

C:\Prog\Git\tests\rep\main5>git show-ref | grep f4a071 | awk "{print $2}" 
refs/heads/master 
refs/remotes/origin/HEAD 
refs/remotes/origin/master 

beaucoup d'options sont disponibles pour git show-ref et vous permettra de:

  • écran aussi déréférencé SHA1
  • affichage SHA1 seulement pour un motif de refs

L'OP ajoute:

il retournera rien du tout si un SHA passé ne le fait pas référence une tête ou tout autre commit déréférencable?
Avez-vous une idée de la façon dont nous pourrions faire l'étape intermédiaire de déterminer le SHA du commit le plus récent appartenant à la même branche que le SHA passé?

Une autre commande de plomberie qui peut aider serait git name-rev:

C:\Prog\Git\tests\rep\main5>git name-rev a7768453 
a7768453 patches~1 

C:\Prog\Git\tests\rep\main5>git name-rev a7768453|gawk "{gsub(/~.*/,\"\",$2);print $2} 
patches 

Comme Jefromi mentions dans les commentaires, une commande de porcelaine serait git branch --contain:

C:\Prog\Git\tests\rep\main5>git branch --contain 1e73e369 
    master 
* patches 
    tmp 

--contains <commit> 

Ne lister que les branches qui contiennent le s commit spécifié.
Il est utilisé pour trouver toutes les branches qui nécessiteront une attention particulière si <commit> devait être rebasée ou modifiée, puisque ces branches contiennent le <commit> spécifié.

+0

Merci beaucoup et vous avez raison en est proche d'au moins 9 fois sur 10. Seul problème gauche: il retournera rien du tout si un SHA passé ne fait pas référence à une tête ou tout autre dereferencable commettre ? Avez-vous une idée de comment nous pourrions faire l'étape intermédiaire de déterminer la SHA de la dernière engager appartenant à la même branche que le CSA a adopté (par exemple, si on passe SHA pour engager 32 nous obtenons le CSA retour pour engager 0 (aka HEAD))? – andreb

+1

@andreb: bon point. 'show-ref' est seulement pour les références SHA1 directement par les refs. 'name-rev' peut aider à attraper le reste. Voir ma réponse mise à jour. – VonC

+0

@andreb: Voir aussi http://stackoverflow.com/questions/917102/in-git-is-there-a-way-to-get-the-friendly-name-for-an-arbitrary-commit pour plus – VonC

Questions connexes