2009-07-21 6 views
42

Est-ce que quelqu'un sait comment obtenir le dernier SHA d'une branche donnée de l'extérieur un dépôt git?Comment obtenir SHA de la dernière validation du référentiel git distant?

Si vous êtes à l'intérieur d'un dépôt git, vous pouvez le faire:

git log origin/branch_X | head -1 

Cependant, je ne suis pas dans un dépôt git, et je voudrais éviter d'avoir à clone un dépôt juste pour obtenir le dernier SHA d'une étiquette/branche. Y a-t-il une manière intelligente de faire ceci?

+0

Avez-vous un accès au référentiel que vous souhaitez interroger? –

+3

La façon correcte de le faire est "git rev-parse origine/branche_X" ou "git rev-parse refs/télécommande/origine/branche_X", pas git-log –

Répondre

50

Si vous voulez vérifier SHA-1 de la branche donnée dans le référentiel distant, your answer est correcte:

$ git ls-remote <URL> 

Toutefois, si vous êtes sur le même système de fichiers solution plus simple (ne nécessitant pas d'extraire SHA-1 de sortie) serait simplement:

$ git --git-dir=/path/to/repo/.git rev-parse origin/branch_X 

Voir git(1) page de manuel description de l'option '--git-dir'.

15

Un de mes collègues a répondu pour moi:

git ls-remote ssh://git.dev.pages/opt/git/repos/dev.git <branch> 

-Steve

+1

merci. Cela devrait être amélioré comme réponse à cette question. – Abhijeet

3

Les références à la tête de la branche sont stockées dans l'arbre .git/refs/. Donc, vous devriez être capable de trouver le hachage du dernier commit à:

cat .git/refs/remotes/origin/branch_X 

Votre chemin peut différer légèrement.

+1

Cela ne fonctionnerait pas si vous avez des refs emballés. Ensuite, vous devez jeter un oeil à .git/packed-refs –

+0

C'est vrai, cette solution est susceptible de tous les changements futurs dans le format de dépôt sur disque Git. –

3

Si vous voulez juste le SHA-1 à partir de la, vous pouvez simplement spécifier la branche actuellement extrait de votre repo local, HEAD au lieu d'origine/branch_X:

git --git-dir=/path/to/repo/.git rev-parse --verify HEAD

14

Cela devrait faire l'affaire git ls-remote REMOTE | awk "/BRANCH/ {print \$1}"

Remplacez REMOTE par le nom du référentiel distant et BRANCH par le nom de la branche.

74

Utilisez rev-parse

git rev-parse origin/master # to get the latest commit on the remote 

git rev-parse HEAD   # to get the latest commit on the local 
+1

+1 Prouvé le plus utile avec ajout | clip pour déposer le sha sur le presse-papiers (windows). –

+0

Et pour les utilisateurs mac 'git rev-parse origine/maître | pbcopy' va supprimer le commit sha (avec un '\ n') dans votre presse-papiers pour que vous puissiez coller à votre convenance. – Aaron

+1

'git rev-parse HEAD' renvoie la dernière validation dans la copie locale, tandis que' git rev-parse origin/master' renvoie la dernière validation sur remote, ce qui est demandé ici. C'est ma réponse préférée, même si la première commande doit être supprimée. – fedelibre

14

En utilisant une URL git:

$ git ls-remote <URL> | head -1 | sed "s/HEAD//" 

L'utilisation d'un répertoire sur un système accessible:

$ git --git-dir=/path/to/repo/.git rev-parse origin/<targeted-banch> 
+1

Utilisez 'sed 's/\ tHEAD //" 'pour supprimer également l'onglet de fin. – Perseids

+1

Pourquoi ne pas utiliser '| awk '{print $ 1}' '? – devxoul

+1

ou 'coupe -f 1'? – kisp

8

Comme mentionné dans les commentaires ci-dessus cela devrait être le meilleur solution:

$ git ls-remote <URL> | head -1 | cut -f 1

+1

C'est la seule option qui a fonctionné (pour moi) pour obtenir la validation d'une télécommande en amont dans un repo forké. – Jalakoo

1

Je recommande d'information fetching ne portait que sur une branche, puis Parse pour obtenir la dernière sha:
git ls-remote <url> --tags <branch_name> | awk '{print $1;}'

2

Heres une solution de copier-coller qui fonctionne à l'intérieur du dépôt.

origin_head=$(git ls-remote --heads $(git config --get remote.origin.url) | grep "refs/heads/master" | cut -f 1) 
if [ $origin_head != "$(git rev-parse HEAD)" ]; then 
    echo >&2 "HEAD and origin/master differ." 
    exit 1 
fi 
+1

Je recommanderais 'grep 'refs/heads/master $" ', donc si quelqu'un pouvait demander d'autres branches que master ou ayant une branche master2 cela pourrait se casser;) – kitingChris

Questions connexes