Repos (1)

Por un curso que estoy tomando (otro, no el de TeX y LaTeX, que por cierto ya terminé) me topé con la pregunta si sería posible hacer un fork de un repositorio de GitHub dentro de otro. Material de dicho curso, así como los exámenes de cada módulo, los he venido colocando en un repositorio.

Tanto el colegio como los instructores cuentan con repositorios también. Lo más natural en estos casos es pensar en descargar el material del curso y colocarlo como parte del expediente que uno va conformando (como hice con el mencionado curso de TeX y LaTeX; uno obtiene el material y éste queda «congelado en el tiempo») pero, en este caso, el problema se presenta cuando el material del curso no está terminado o el instructor hace afinaciones posteriores (claro, esto dice mucho de la calidad del colegio pero ese es tema de otro post). Así que, tomar todo el material pensando en retenerlo desde ese instante como material de referencia, no parecía ser la mejor idea; descargar material incompleto o el estar buscando actualizarlo a lo largo de las 24 semanas que dura el curso parece poco práctico.

Aunque hacer un fork de los repositorios del curso podría parecer una mejor opción, uno debe tener presente que la actualización de estos podría hacerlos divergir con el paso del tiempo sobre lo que uno vio en el curso. De entre todas las opciones consideradas y posibles, consideré que eso sería peccata minuta. Todo apuntaba a que tener estos repositorio como «sub repositorios» de mi repositorio (perdone la redundancia, estimado lector) era lo mejor. Así fue que llegué a la pregunta en cuestión.

En la Internet encontré algunas ideas pero cada una llevaba ciertas preferencias e influencia del contexto, por lo que terminé recurriendo con «el lic» para determinar si se podía o no, y cuáles serían las alternativas. La respuesta resumía mucho de lo ya encontrado y estaba limpia de preferencias y contextos, por lo que procedí a su implementación. Aunque mi repositorio lo tengo como privado, por cuestiones de privacidad con el colegio e instructores reemplazaré algunas cosas (usando elementos entre «<» y «>») en lo que ilustro más abajo para mantener todo en el anonimato.

Mientras que no es posible tener repositorios dentro de repositorios en forma de un fork, si es posible tenerlos en forma de sub módulos o sub árboles, cada una con sus diferencias y ventajas. Yo he optado por el primero y, por el momento, ilustro la salida a pantalla de las instrucciones usadas y sus resultados:

...
$ cd <ruta-a-mi-repo-clonado>
$ mkdir Repos; cd Repos
$ git submodule add <uri-de-un-repo> EyPCD
Cloning into '<ruta-a-mi-repo-clonado>/Repos/EyPCD'...
remote: Enumerating objects: 1552, done.
remote: Counting objects: 100% (440/440), done.
remote: Compressing objects: 100% (315/315), done.
remote: Total 1552 (delta 214), reused 226 (delta 107), pack-reused 1112
Receiving objects: 100% (1552/1552), 41.16 MiB | 13.32 MiB/s, done.
Resolving deltas: 100% (813/813), done.
$ git submodule init
$ git submodule update
$ git commit -am "Added <el-nombre-del-repo> as submodule"
[master de42a0b] Added '<el-nombre-del-repo>' repo as submodule
 2 files changed, 4 insertions(+)
 create mode 100644 .gitmodules
 create mode 160000 <ruta-parcial-a-mi-repo-clonado>/Repos/EyPCD
$ git push
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 8 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 699 bytes | 699.00 KiB/s, done.
Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
To <uri-de-mi-repo>
   360a1f9..de42a0b  master -> master
$ ls
EyPCD
$ git submodule add <uri-del-otro-repo> EEML
Cloning into '<ruta-a-mi-repo-clonado>/Repos/EEML'...
remote: Enumerating objects: 355, done.
remote: Counting objects: 100% (159/159), done.
remote: Compressing objects: 100% (79/79), done.
remote: Total 355 (delta 78), reused 159 (delta 78), pack-reused 196
Receiving objects: 100% (355/355), 9.71 MiB | 9.04 MiB/s, done.
Resolving deltas: 100% (166/166), done.
(base) Codex:Repos lalo$ git submodule init
(base) Codex:Repos lalo$ git submodule update
(base) Codex:Repos lalo$ ls
EEML	EyPCD
(base) Codex:Repos lalo$ git commit -am "Added '<nombre-del-otro-repo>' repo as submodule"
[master add8b58] Added '<nombre-del-otro-repo>' repo as submodule
 2 files changed, 4 insertions(+)
 create mode 160000 <ruta-parcial-a-mi-repo-clonado>/Repos/EEML
(base) Codex:Repos lalo$ git push
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 8 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 655 bytes | 655.00 KiB/s, done.
Total 5 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To <uri-de-mi-repo>
   de42a0b..add8b58  master -> master
$ ls
EEML	EyPCD

En este punto, los dos directorios mostrados al final, contienen un clon de los otros dos repositorios. En la interfaz de GitHub, de hecho, podrá verse que el icono del folder es diferente.

En el siguiente post, indicaré algunas consideraciones y buenas prácticas al respecto.

Siguiente

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.