Supongamos que tengo un repo gigantesco y quiero descargar solo 100 commits para clonar más rápido:
$ git clone --branch 9.0 --depth 100 https://github.com/odoo/odoo.git
Guay, pero ahora necesito 100 commits de la rama 10.0 también para poder cambiar a ella. Normalmente haría:
$ git fetch --depth 100 origin 10.0 $ git checkout 10.0
Pero me encuentro con que el checkout no funciona como era de
esperar... ¿Qué hago?
Por qué sucede
Si no hubiéramos clonado con --depth 100, la cosa funcionaría así:
$ git fetch --depth 100 origin 10.0 $ git branch --all * 9.0 remotes/origin/9.0 remotes/origin/10.0 remotes/origin/HEAD -> origin/9.0
Pero al haber clonado con --depth 100, nos encontramos que tras el
fetch no existe la rama remota 10.0 que supuestamente
hemos descargado:
$ git fetch --depth 100 origin 10.0 $ git branch --all * 9.0 remotes/origin/9.0 remotes/origin/HEAD -> origin/9.0
Esto es así porque clonaste con --depth o con
--single-branch (que es implícito al usar --depth), git
queda preconfigurado para ignorar cualquier rama remota que no sea la que le
indicaste al clonar (o la principal -- normalmente master -- si no le
indicaste ninguna).
Cómo solucionarlo
Por lo tanto, si ahora queremos también detectar cambios en la rama remota
10.0,
hay que decírselo explícitamente a git:
$ git remote set-branches --add origin 10.0
$ git fetch --depth 100 origin 10.0
$ git branch --all
* 9.0
remotes/origin/9.0
remotes/origin/10.0
remotes/origin/HEAD -> origin/9.0
Tras eso, ya podemos crear una rama local 10.0 que apunte a
origin/10.0, que con un comando sería:
$ git checkout --branch 10.0 origin/10.0