git shallow clone (clone depth depth) pierde ramas remotas


Después de clonar un repositorio remoto no muestra ninguna rama remota por-a opción. ¿Cuál podría ser el problema? Cómo depurar? En este fragmento no se muestran dos de las ramas remotas:

$ 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

Probé 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 intentarlo en esta máquina de nuevo, pero sería mejor saber qué está mal.

Cualquier sugerencia o sugerencia será más que bienvenida.

Edit: Answer summary: Desde la versión 1.8.3.2 de git, "depth depth" y "no no-single-branch" deben usarse juntos para obtener el mismo comportamiento que antes. Esto se considera una corrección de errores.

Author: minghua, 2014-05-17

3 answers

El comportamiento es correcto, después de la última revisión la rama maestra es (ya que esta es la CABEZA del remoto primario) 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) ramas:

florianb$ git branch -a
        * master
          remotes/origin/HEAD -> origin/master
          remotes/origin/debian
          remotes/origin/master
          remotes/origin/python_codegen

Clones poco profundos

Debido a la descripción superficial en la documentación técnica, un "git-clone --depth 20 repo [...] result [s in] cadenas de confirmación con una longitud máxima de 20."Por lo tanto, un clon superficial debería contener la profundidad solicitada de las confirmaciones, de la punta de una rama.

Como, además, la documentación de git clone para el --single-branch-opción describe:

"Clone solo el historial que conduce a la punta de una sola rama, ya sea especificada por la opción --branch o los puntos del control remoto de la rama primaria HEAD. Cuando se crea un clon superficial con la opción --depth, esta es la opción predeterminada, a menos que --no-single-branch se dé para obtener los historiales cerca de las puntas de todas las ramas."

Por lo tanto, un superficial clon (con el profundidad-opción) sólo recupera sólo una sola rama (en su solicitud de profundidad).


Desafortunadamente ambas opciones (--depth y --single-branch) han sido defectuosas en el pasado y el uso de clones superficiales implica problemas no resueltos (como se puede leer en el enlace que publiqué anteriormente), que es causado por la reescritura de la historia dada. Esto conduce en general a un comportamiento algo complicado en casos especiales.

 34
Author: florianb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-19 18:56:35

Después de hacer un clon superficial, para ser capaz de checkout otras ramas desde remoto ,

  1. Corre (gracias @ jthill):

    git remote set-branches origin '*'
    
  2. Después de eso, hacer una git fetch -v

  3. Por último 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 línea siguiente de:

fetch = +refs/heads/master:refs/remotes/origin/master

A (sustitúyase master por *):

fetch = +refs/heads/*:refs/remotes/origin/*
 91
Author: marlo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-15 16:13:39

De leer las respuestas y el comentario de @jthill, lo que funcionó mejor para mí fue usar la opción set-branches en el git remote orden:

$ 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 nombrado para que podamos obtener y checkout solo la rama requerida.

 33
Author: alejandrodnm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-07 16:41:01