X

Clonar directorios independientes con Git

En más de una ocasión se me ha presentado la necesidad de modificar ficheros específicos de un proyecto, o ficheros de una carpeta concreta. Si el repositorio es excesivamente grande puede resultar tedioso (a veces peligroso) clonar el repositorio entero. Lo ideal, por tanto,  sería poder clonar directorios independientes con git. Después de investigar y de reunir la información suficiente descubrí que mezclando dos técnicas de Git podía conseguir este resultado de forma sencilla. Ni que decir tiene que todo esto sale de Stack Overflow y demás sitios, pero en el momento de requerir la solución a esta situación no encontré nada unificado. Comparto por tanto la mencionada solución por si alguien se encuentra con el mismo problema y, de paso, me sirva a mi como referencia en futuros proyectos.

Sparse Checkouts + Shallow Clones

Desde la versión 1.7 de Git se pueden realizar los llamados «sparse checkouts» que nos permitirán hacer checkout de solo las carpetas que indiquemos. A continuación detallamos los pormenores de su utilización.

1- Iniciamos un repositorio vacío, estableciendo la de nuestro repositorio como repositorio remoto:

mkdir <repo>
cd <repo>
git init
git remote add -f origin <url>

2- Activamos la opción sparseCheckout:

git config core.sparseCheckout true

3- Definimos los ficheros y carpetas que queremos sincronizar. Para ello haremos uso del fichero .git/info/sparse-checkout del mismo modo que hacemos con .gitignore, es decir, escribiendo los distintos ficheros y carpetas en lineas diferentes.

carpeta/subcarpeta
otraCarpeta/fichero.txt

Desde este punto podemos continuar de dos formas:

a) Actualizamos el repositorio clonando desde la url remota:

git pull origin master

Esto descargará la carpeta .git completa, pero solo mostrará las carpetas que hayamos establecido en el fichero sparse-checkout. Esto es así porque por defecto cualquier clonado obtiene no solo los ficheros del repositorio, si no todos los ficheros de todos los commits realizados a lo largo de la vida del mismo.

b) Desde la versión 1.9 de Git podemos realizar un git pull superficial, también llamado «shallow clone«. Esto nos permitirá establecer la profundidad del clonado, de tal forma, que al establecer una profundidad de 1, solo se descargará lo referente a la última revisión:

git pull --depth=1 origin master

Este comando es, por tanto, más apropiado para el propósito que queremos conseguir. Además, puede disminuir hasta en un 90% el tamaño de cada descarga.

Miguel:
Entrada Relacionada