Cambiar de Branch en un Shallow Clone

Si estas usando sistemas de integración continua (Continuous Integration), trabajas con repositorios pesados o simplemente no quieres pasar por un un clonado de Git que te traiga todo el árbol de un repositorio, seguro que estás familiarizado con el concepto shallow clone o clonado superficial.

Un shallow clone o cloando superficial permite traerse los últimos commits y no todo el histórico del repositorio Git. Aunque pueda parecer una solución maravillosa para desprenderse de los problemas de un clonado completo del histórico del árbol Git , presenta ciertos problemas a la hora de operarlo como un repositorio clonado de manera normal cuando se ha clonado bajo estas condiciones específicas de clonado.

🐑 Crear un clonado superficial

Para ejecutar un clonado superficial o shallow clone lo haremos con el siguiente comando:

git clone -–depth [depth] [remote-url]

Donde depth la profundidad es el número de commits que nos vamos a traer durante el clonado y remote-url es la dirección URL de origen de donde vamos a clonar el repositorio. 👀 El uso de --depth implica --single-branch.

Para ejecutar clonado superficial o shallow clone de una rama o branch podemos hacerlo con:

git clone [remote-url] -–branch [name] -–single-branch

Donde name es el nombre de la rama o branch que queremos clonar.

Si aún queremos hilar más fino y resulta que tenemos repositorios con submódulos (repositorios Git incluidos en otro repositorio), los cuales tienes su propio árbol Git y se inicializan usando alguno de los siguientes comandos:

git clone -–recursive [remote-url]  # Git version >= 1.6.5
git clone -–recurse-submodules -–jobs [num-jobs] [remote-url]   # Git version >= 2.13

La primera sintaxis con recursive puede resultar más cómoda, aunque resulta más rápida y eficiente la segunda con recurse-submodules, la cual es la sintaxis vigente que permite especificar el número de submódulos operados concurrentemente mediante jobs.

Si este es tu caso, no tiene sentido hacer un clonado superficial si se hace un clonado completo de los submódulo. Para ello ejecutaremos el siguiente comando:

git clone -–depth [depth] -–shallow-submodules [remote-url]

La opción --shallow-submodules implica que todos los submódulos se clonarán con una profundidad de 1.

🐏 Convertir un repositorio con clonado superficial en uno de tipo clonado completo

Si has seguido los pasos anteriores, te darás cuenta que si quieres cambiarte por ejemplo a otra rama no puedes. Eso es debido a que se ha omitido el resto del histórico según se lo hemos especificado. ¿Eso significa que no existe? No, eso sólo quiere decir que no lo conocemos.

Si ejecutamos el siguiente comando sobre un repositorio clonado superficialmente, veremos los remotos que conocemos y los remotos existentes en el local:

git branch -–all

Si intentamos hacer un fetch del remoto veremos que tampoco conseguimos ver el histórico completo del repositorio:

git fetch -–verbose

Esto es debido a que nuestro remoto no está convenientemente configurados debido al clonado superficial. Podemos restaurar su funcionalidad completa partiendo de que nuestro remoto origin, de donde clonamos el repositorio, contiene la remote -url que metimos. Por ello podemos restaurar el acceso a todo el histórico del remoto para nuestro repositorio, usando el siguiente comando:

git remote set-branches origin "*"

Mediante la opción set-branches podemos cambiar la lista de ramas que son seguidas por el remoto conocido y por defecto que es origin.

Ahora volvemos a ejecutar el comando fetch de nuevo y en este caso podremos apreciar que la totalidad de ramas aparecen:

git fetch -–verbose

Adicionalmente también restauramos el histórico completo de la rama actual donde nos encontramos:

git fetch --unshallow

Con esto ya tenemos acceso al historial completo del repositorio y podremos cambiarnos a otra rama a la cual antes no podíamos:

git checkout rama-que-estaba-buscando

Si quieres comprobar el último commit de la rama local para cotejarlo con el último commit disponible el remoto y comprobar que está todo correcto, puedes hacerlo con:

git show

💡 Conclusiones

El clonado superficial o shallow clone es una gran herramienta, pero puede echarnos el lazo al cuello si no sabemos y necesitamos deshacerlo. No obstante aunque siempre existe la opción de hacer un clonado clásico de nuevo, no resulta una opción elegante y eficiente que nos obliga a duplicar y volver a clonar el repositorio.





2002 Visitas Totales 1 Visitas para Hoy

Deja un comentario