Clonar un repositorio de Git con una revisión específica

John Wachira 20 junio 2023
Clonar un repositorio de Git con una revisión específica

Este artículo analiza los diversos métodos que podemos emplear para clonar un repositorio de Git con una revisión específica o un conjunto de cambios. Es conveniente cuando tiene un repositorio con archivos grandes y solo necesita una versión de código específica.

En lugar de clonar todo el repositorio, puede obtener un conjunto de cambios específico que puede ayudar a reducir el tiempo de clonación, especialmente si se trata de archivos grandes.

Clonar un repositorio de Git con una revisión específica

Podemos usar varios métodos para clonar un repositorio con un conjunto de cambios específico. Comencemos con el desarrollo reciente en Git que nos permite usar el comando git fetch con un compromiso de interés.

Antes de la versión 2.5.0 de Git, git fetch origin <commit id> no funcionaba. Con el lanzamiento de la versión 2.5.0, Git se incluyó con la opción de configurar uploadpack.allowReachableSHA1InWant en true en el lado del servidor.

Una vez establecido en true, podemos obtener cualquier confirmación accesible. Esta función está desactivada de forma predeterminada y no se recomienda por motivos de seguridad y rendimiento.

Algunos servidores Git como Bitbucket suelen tener esta función activada de forma predeterminada. Siga estos pasos para obtener pequeños subconjuntos de un gran repositorio de Git en conjuntos de cambios específicos.

Inicializamos un repositorio de Git en el directorio que deseamos clonar.

$ git init

Luego agregaremos nuestro control remoto al repositorio local.

$ git remote add origin <url://to/source/repository

Ahora podemos obtener el compromiso que queremos, como se ilustra a continuación.

$ git fetch origin <sha1-of-commit-of-interest>

Finalice el proceso restableciendo la rama al compromiso de interés.

$ git reset --hard FETCH_HEAD

Tenga en cuenta que esto obtendrá el historial completo de confirmación, incluida la confirmación especificada. Puede limitar esto con las banderas --depth=...' o '--shallow-since=....

Este método no es seguro y es posible que no funcione para todos los servidores Git. ¿Existen alternativas a este método que lleguen al mismo destino?

El método que estamos a punto de discutir es ideal para repositorios pequeños. Todavía funcionará con repositorios grandes, pero requerirá paciencia de su parte.

Suponiendo que ya sabe de qué confirmación desea clonar, comience por clonar todo el repositorio.

Comience agregando el control remoto a su repositorio local y proceda a clonar, como se muestra a continuación.

$ git clone <repo url>

Una vez hecho esto, mueva HEAD a la confirmación de interés usando el comando git reset, como se ilustra a continuación.

$ git reset --hard <commit id>

Si desea volver a la confirmación más reciente, ejecute el comando git pull.

Alternativamente, puede clonar el repositorio y cambiar a la confirmación de interés usando el comando git checkout, como se muestra a continuación.

$ git clone <repo url>

Para cambiar a la confirmación:

$ git checkout <commit id>

Ejecute el comando git reset mientras está en el modo HEAD desconectado, como se muestra a continuación.

$ git reset --hard

Este enfoque es ideal si desea jugar con el código sin cambiar el contenido de la rama.

Ejecute el comando git switch - para salir del modo HEAD separado.

En conclusión, algunos servidores de Git, como Bitbucket, nos permiten buscar desde un compromiso accesible. Necesitará la versión 2.5+ de Git para aprovechar la función uploadpack.allowReachableSHA1InWant, que le permitirá ejecutar el comando git fetch origin <commit-of-interest>.

Hemos cubierto otras alternativas que llegarán al mismo destino.

John Wachira avatar John Wachira avatar

John is a Git and PowerShell geek. He uses his expertise in the version control system to help businesses manage their source code. According to him, Shell scripting is the number one choice for automating the management of systems.

LinkedIn

Artículo relacionado - Git Clone