Usando git para obtener solo la última revisión

3 minutos de lectura

Quiero rastrear un proyecto que usa git. No quiero clonar el repositorio completo y el historial completo, solo quiero la última revisión y quiero poder actualizar a nuevas revisiones desde el proyecto remoto.

Intenté usar git clone, pero esto crea una copia de todo el repositorio (tamaño de archivo enorme), y el seguimiento de los cambios hace que el espacio en disco sea aún más grande (100 mb de archivos ahora ocupan más de 2 gb).

No voy a enviar parches y no necesito el historial. Solo quiero la última versión como en subversion.

¿Es esto posible en git?

  • Git 1.9/2.0 (Q1 2014) será mucho más eficiente con clonación superficial: stackoverflow.com/a/21217267/6309 y stackoverflow.com/a/21217326/6309

    – VoC

    19 de enero de 2014 a las 13:28

Usando git para obtener solo la ultima revision
greg hewgill

Utilizar git clone con el --depth opción establecida en 1 para crear un clon superficial con un historial truncado a la última confirmación.

Por ejemplo:

git clone --depth 1 https://github.com/user/repo.git

Para inicializar y actualizar también cualquier submódulo anidado, también pase --recurse-submodules y para clonarlos superficialmente, también pase --shallow-submodules.

Por ejemplo:

git clone --depth 1 --recurse-submodules --shallow-submodules https://github.com/user/repo.git

  • ejemplo: git clone --depth=1 <remote_repo_url>

    – iDev247

    15 de enero de 2013 a las 23:01


  • Ya que cometer 82fba2b en git 1.9 estas limitaciones ya no existen.

    – niutech

    5 de marzo de 2014 a las 13:26


  • ¿Qué limitaciones?

    – Ignorante

    11 de septiembre de 2016 a las 10:38

  • @Triangles: Limitaciones (ya no es actual): un repositorio poco profundo tiene una serie de limitaciones (no se puede clonar ni extraer de él, ni empujar desde ni hacia él), pero es adecuado si solo está interesado en la historia reciente de un gran proyecto con una larga historia, y querría enviar correcciones como parches.

    – odinho – Velmont

    14 de septiembre de 2016 a las 9:54

  • La opción fue agregado en git 1.8.4.

    – ivan_pozdeev

    24 de diciembre de 2017 a las 15:35

Solución alternativa para hacer un clon superficial (git clone --depth=1 <URL>) sería, si el lado remoto lo admite, usar --remote opción de archivo git:

$ git archive --format=tar --remote=<repository URL> HEAD | tar xf -

O, si el repositorio remoto en cuestión es navegable usando algún interfaz web como gitweb o GitHub, entonces existe la posibilidad de que tenga la función de ‘instantánea’, y puede descargar la última versión (sin información de versión) desde la interfaz web.

  • Sin embargo, esta solución no satisfará este requisito: “Quiero poder actualizar a nuevas revisiones desde el proyecto remoto”. Dado que básicamente descarga el archivo, no podrá avanzar rápidamente una o dos confirmaciones. El “clon superficial” lo permite. Aún así, supongo que esta solución tiene sus casos de uso, por lo que vale la pena mencionarlo.

    – Vasili Novikov

    19 de septiembre de 2017 a las 22:21


Estos días, se recomienda contra los clones superficiales en la mayoría de los casos.

Mientras que, para el caso de uso que mencionas (descarga la última versión y nunca más la toques), git clone --depth=1 funciona, en el caso más general, puede crear problemas. Por ejemplo, si desea mantener su clon actualizado con upstream, git fetch es mucho más caro en un clon poco profundo.

Si lo que quieres es descargar menos datos, los clones parciales son mejores para el caso general:

git clone --filter=tree:0 <url>

Esto seguirá descargando el historial de confirmaciones, pero no descargará los árboles de archivos ni el contenido de los archivos de confirmaciones anteriores. Las recuperaciones de confirmaciones ascendentes seguirán siendo baratas.

  • ¡Buena información! Vale la pena mencionar que el autor del artículo vinculado afirma que él “recomienda encarecidamente que los desarrolladores no usen clones sin árbol para su trabajo diario”. En su lugar, use clones sin blobles: git clone --filter=blob:none <url>

    – bernhof

    14/12/2021 a las 19:00


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad