2010-09-13 139 views
18

No tengo un código local de copia/etc, solo quiero descargar un solo commit específico de git para poder verlo. Tengo la URL del repositorio git:¿Cómo descargo un commit específico de git desde un repositorio?

git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git

y el hash de cometer:

ee9c5cfad29c8a13199962614b9b16f1c4137ac9 

¿Cómo puedo descargar sólo esta comprometerse usando git (no quiero que todo el repositorio, simplemente el parche de compromiso)? He leído las páginas de man para git-pull y git-cherry-pick y jugueteado con las órdenes sin suerte.

Clonar el repositorio realmente no es una opción porque algunos de los repositorios Kernel son excesivamente grandes y tardan en descargarse (horas).

+0

has necesitado navegando [esta cesión temporal a través de la web] (http://git.kernel.org/?p=linux/kernel/git/davem /net-2.6.git;a=commit;h=ee9c5cfad29c8a13199962614b9b16f1c4137ac9)? – bstpierre

+1

Me gustaría hacerlo desde la línea de comandos por una variedad de razones (la velocidad/eficiencia y las secuencias de comandos son las principales). – bigredbob

+3

Una confirmación es esencialmente una diferencia. ¿Quieres ver el diff o ver el árbol? – Daenyth

Respuesta

21

Esto parece ser imposible. De acuerdo con un discussion en kernel.org, el protocolo solo permitirá la búsqueda de refs con nombre. Si no desea descargar la instantánea del sitio web de git, deberá clonar todo el repositorio.

(Es posible que desee leer los manuales de git-fetch y git-ls-remote.)

1
git show COMMITID 

Pero tienes que clonar el repositorio. No hay forma de evitar eso, creo. Pero puedes hacer un clon superficial usando --depth arg.

Además, encontraron un puesto bueno, así que trata este tema con mayor profundidad Browse and display files in a git repo without cloning

11

En el caso general, puede hacerlo usando la bandera --remote a git archive, así:

$ git archive -o repo.tar --remote=<repo url> <commit id> 

Así en su ejemplo, usaría:

$ git archive -o repo.tar --remote=git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git ee9c5cfad29c8a13199962614b9b16f1c4137ac9 

Eso le dará el estado del repositorio en ese momento. Tenga en cuenta que no obtendrá el repositorio completo, por lo que no puede interactuar con el repositorio de subida con lo que ha descargado.

Sin embargo, el uso de git archive de forma remota debe habilitarse en el lado del servidor, y no está en el servidor Git del kernel de Linux. Sin embargo, puede tomar una copia utilizando una URL del formulario http://git.kernel.org/?p=<path to repo>;a=snapshot;h=<commit id>;sf=tgz. Entonces, para su repositorio, podría usar, digamos, wget o curl para tomar el archivo usando esa URL.

+1

Lamentablemente, este método no es confiable/scriptable (y algunos repositorios git no tienen interfaces web fácilmente encontradas). – bigredbob

+0

Es cierto, pero en su caso específico, funcionaría. – mipadi

+1

Debería funcionar, excepto que el material web se genera sobre la marcha. Los resultados de 'http rizo:? //git.kernel.org/ p = linux/kernel/git/daveM/net-2.6.git; a = instantánea; h = ee9c5cfad29c8a13199962614b9b16f1c4137ac9; sf = tgz' son' Generación .. . ' – wlangstroth

-1

En este caso, si lo que quieres es el diff, puede descargarlo desde la interfaz web para el repositorio del kernel en la siguiente dirección:

http://git.kernel.org/?p=linux/kernel/git/davem/net-2.6.git;a=commitdiff_plain;h=ee9c5cfad29c8a13199962614b9b16f1c4137ac9 

Puedes jugar con la url u otros compromisos.

2

Sé que esto funciona cuando se tiene un clon de la recompra (repo o una similar) ..

git fetch git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git 
git cherry-pick ee9c5cfad29c8a13199962614b9b16f1c4137ac9 

Fetch descargas los árbitros remotos (pero no toda la recompra, no creo) por lo que puede hacer referencia a ellos con los otros comandos. Luego seleccionas con precisión ese commit, e intenta aplicar el diff a tu árbol local.

No he probado sin un repositorio git localmente, pero yo he probado en repos que no son tenedores de entre si. puede obtener conflictos de combinación, pero puede limpiarlos manualmente.

+0

Eso funcionará solo si el compromiso que está escogiendo es un antecesor de HEAD del repositorio. –

+0

Acabo de probar esto --- el 'git fetch' intenta descargar todo. –

0

yo estaba en la misma necesidad. Necesito descargar un parche de un compromiso específico que necesito aplicar a otra sucursal.

utilicé: git format-patch sha-id

Sólo especifique el sha-id que es justo mayor que la requerida comprometerse. Dará .patch archivos correspondientes a todos los commits.

0

que corrieron a este problema hoy en día, y han encontrado una manera de descargar archivos de cometer un específico. Si vas a un repositorio en git.kernel.org hay una sección de clonación en la parte inferior. La url inferior es un espejo google git. Podrás descargar archivos de confirmaciones específicas desde aquí.

0

Hay una manera de hacer esto:

git show ee9c5cfad29c8a13199962614b9b16f1c4137ac9 > myCommittedCode.txt 
Cuestiones relacionadas