2009-07-21 15 views
42

¿Alguien sabe cómo obtener el SHA más reciente de una sucursal determinada desde el exterior un repositorio de git?¿Cómo obtener SHA de la última confirmación desde el repositorio remoto de git?

Si está dentro de un repositorio git, se puede hacer:

git log origin/branch_X | head -1 

Sin embargo, no estoy dentro de un repositorio git, y me gustaría no tener que clone un repositorio sólo para obtener la última SHA de una etiqueta/rama. ¿Hay alguna manera inteligente de hacer esto?

+0

¿Tiene acceso al sistema de archivos del repositorio que desea consultar? –

+3

La forma correcta de hacerlo es "git rev-parse origin/branch_X" o "git rev-parse refs/remotes/origin/branch_X", no git-log –

Respuesta

50

Si desea comprobar SHA-1 de la rama dada en el repositorio remoto, a continuación, your answer es correcta:

$ git ls-remote <URL> 

Sin embargo, si usted está en solución, el mismo sistema de ficheros más simple (que no requiere extraer SHA-1 de salida) sería simplemente:

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

Ver git(1) página del manual de descripción de la opción '--git-dir'.

15

Un colega mío respondió por mí:

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

-Steve

+1

gracias. Esto debe actualizarse como respuesta para esta pregunta. – Abhijeet

3

Las referencias a los directores de las sucursales se almacenan en el árbol .git/refs/. Por lo tanto, debería poder encontrar el hash de la última confirmación en:

cat .git/refs/remotes/origin/branch_X 

Su ruta puede variar levemente.

+1

Eso no funcionaría si tiene refs empaquetados. Luego debe echarle un vistazo a .git/packed-refs –

+0

Es verdad, esta solución es susceptible a cualquier cambio futuro en el formato del repositorio de Git en disco. –

3

Si lo que desea es el SHA-1 de la rama actualmente desprotegido de tu repositorio local, usted puede simplemente especificar cabeza en lugar de origen/branch_X:

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

14

Esto debería hacer el truco git ls-remote REMOTE | awk "/BRANCH/ {print \$1}"

Reemplace REMOTE con el nombre del repositorio remoto y BRANCH con el nombre de la rama.

74

Uso 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 demostrado más útil junto con anexar | clip para colocar el sha en el portapapeles (ventanas). –

+0

Y para aquellos usuarios de Mac 'git rev-parse origen/master | pbcopy' colocará el sha de confirmación (con un '\ n') en su portapapeles para que pegue a su conveniencia. – Aaron

+1

'git rev-parse HEAD' devuelve el último commit en la copia local, mientras' git rev-parse origin/master' devuelve el último commit en remoto, que es lo que se ha preguntado aquí. Esta es mi respuesta favorita, incluso si el primer comando debe eliminarse. – fedelibre

14

El uso de un URL git:

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

El uso de un directorio en un sistema accesible:

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

Use 'sed" s/\ tHEAD // "' para eliminar también la pestaña final. – Perseids

+1

¿Por qué no usar '| awk '{print $ 1}' '? – devxoul

+1

o 'corte -f 1'? – kisp

8

Como se mencionó en los comentarios por encima de este debería ser el mejor solución:

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

+1

Esta es la única opción que funcionó (para mí) para obtener la confirmación de un control remoto aguas arriba en un repositorio bifurcado. – Jalakoo

1

recomiendo ir a buscar información relacionada solamente con una rama determinada, y luego Analizar para obtener la última sha:
git ls-remote <url> --tags <branch_name> | awk '{print $1;}'

2

Heres una solución de copiar y pegar, que funciona dentro del repositorio.

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

Yo recomendaría 'grep" refs/heads/master $ "' así que si alguien puede pedir otras ramas que master o tener una rama master2 esto puede romperse;) – kitingChris

Cuestiones relacionadas