usage - git shallow clone(clon--depth) pierde ramas remotas
git clone usage (3)
Después de clonar un repositorio remoto, no muestra ninguna rama remota por una opción. ¿Cual podría ser el problema? Cómo depurarlo? En este fragmento, dos de las ramas remotas no se muestran:
$ git clone --depth 1 git://git.savannah.gnu.org/pythonwebkit.git
$ cd pythonwebkit
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
$ git --version
git version 1.8.3.1
Intentó el mismo comando en otra máquina, funciona bien:
$ git clone --depth 1 git://git.savannah.gnu.org/pythonwebkit.git
Receiving objects: 100% (186886/186886), 818.91 MiB | 3.44 MiB/s, done.
$ cd pythonwebkit/
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/debian
remotes/origin/master
remotes/origin/python_codegen
$ git --version
git version 1.7.1
Intenté también clonar otro repositorio, funciona bien. Aunque puedo probarlo en esta máquina otra vez, pero sería mejor saber qué está mal.
Cualquier sugerencia o sugerencia será más que bienvenida.
Editar: Resumen de respuestas: desde la versión 1.8.3.2 de git, "--depth" y "--no-single-branch" deben usarse juntas para obtener el mismo comportamiento que antes. Esto se considera una solución de error.
Después de hacer un clon superficial, para poder consultar otras ramas desde remoto ,
Ejecutar (gracias @jthill):
git remote set-branches origin ''*''
Después de eso, haz una
git fetch -v
Finalmente
git checkout the-branch-i-ve-been-looking-for
El paso 1 también se puede hacer manualmente editando .git/config
.
Por ejemplo, cambie la siguiente línea de:
fetch = +refs/heads/master:refs/remotes/origin/master
para (reemplazar master
por *
):
fetch = +refs/heads/*:refs/remotes/origin/*
Después de leer las respuestas y el comentario de @jthill, lo mejor para mí fue usar la opción set-branches
en el comando git remote
:
$ git clone --depth 1 https://github.com/dogescript/dogescript.git
$ git remote set-branches origin ''remote_branch_name''
$ git fetch --depth 1 origin remote_branch_name
$ git checkout remote_branch_name
Esto cambia la lista de ramas rastreadas por el control remoto designado para que podamos buscar y extraer solo la rama requerida.
El comportamiento es correcto, después de la última revisión, la rama maestra es (ya que esta es la CABEZA del control remoto principal) la única rama remota en el repositorio:
florianb$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
El clon completo ofrece nuevas (todas) las ramas:
florianb$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/debian
remotes/origin/master
remotes/origin/python_codegen
Clones superficiales
Debido a la shallow-description en la documentación técnica, un " git-clone --depth 20 repo
[...] result [s in] comprometer cadenas con una longitud de como máximo 20". Por lo tanto, un clon superficial debe contener la profundidad de confirmaciones solicitada, desde la punta de una rama.
Como - además - la documentación de git clone
para --single-branch
-option describe:
"Clonar solo el historial que conduce a la punta de una sola rama, ya sea especificado por la opción
--branch
o por los puntosHEAD
del remoto principal de la rama. Al crear un clon superficial con la opción--depth
, este es el valor predeterminado, a menos que--no-single-branch
se da para buscar los historiales cerca de las puntas de todas las ramas " .
Por lo tanto, un clon superficial ( con la opción de profundidad ) solo obtiene una sola rama (a la profundidad solicitada).
Desafortunadamente, ambas opciones ( --depth
y --single-branch
) han sido defectuosas en el pasado y el uso de clones poco profundos implica problemas no resueltos (como puede leer en el enlace que publiqué arriba), que es causado por la historia dada- volver a escribir. Esto conduce en general a un comportamiento algo complicado en casos especiales.