web-dev-qa-db-fra.com

git shallow clone (clone --depth) manque des branches distantes

Après le clonage d'un référentiel distant, aucune branche distante n'est indiquée par l'option -a. Quel pourrait être le problème? Comment le déboguer? Dans cet extrait, deux des branches distantes ne sont pas affichées:

$ 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

Essayé la même commande sur une autre machine, ça marche 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

Essayé aussi de cloner une autre pension, ça marche bien. Bien que je puisse essayer à nouveau sur cette machine, mais il serait préférable de savoir ce qui ne va pas.

Toutes les suggestions ou suggestions seront les bienvenues.

Édition: Résumé de la réponse: Depuis la version 1.8.3.2 de Git, "--depth" et "--no-single-branch" doivent être utilisés ensemble pour obtenir le même comportement qu’auparavant. Ceci est considéré comme un correctif de bogue.

68
minghua

Le comportement est correct. Après la dernière révision, la branche principale (puisqu'il s'agit de la tête HEAD de la télécommande principale) est la seule branche distante du référentiel:

florianb$ git branch -a
        * master
          remotes/Origin/HEAD -> Origin/master
          remotes/Origin/master

Le clone complet offre de nouvelles (toutes) branches:

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

Clones peu profonds

En raison de shallow-description dans la documentation technique, un "git-clone --depth 20 repo [...] entraîne [s dans] des chaînes de validation d'une longueur maximale de 20". Un clone peu profond doit donc contenir la profondeur de commits demandée, à partir du bout d’une branche.

En outre, la documentation de git clone pour l'option --single-branch Décrit:

"Clone uniquement l'historique menant au sommet d'une branche unique, spécifié par l'option --branch Ou par les points HEAD de la branche principale. lors de la création un clone peu profond avec l'option --depth, il s'agit de la valeur par défaut, à moins que --no-single-branch ne soit utilisé pour récupérer les historiques près des extrémités de toutes les branches. "

Par conséquent, un clone peu profond ( avec le profondeur - option) seulement va chercher seulement une seule branche (à la profondeur demandée).


Malheureusement, les deux options (--depth Et --single-branch) Ont été défectueuses dans le passé et l'utilisation de clones superficiels implique des problèmes non résolus (comme vous pouvez le lire dans le lien que j'ai posté ci-dessus), ce qui est causé par l'histoire donnée-réécrire. Cela conduit généralement à un comportement quelque peu compliqué dans des cas particuliers.

52
Florian Breisch

Après avoir fait un clone peu profond, pour pouvoir vérifier les autres branches de la télécommande,

  1. Courez (merci @jthill):

    git remote set-branches Origin '*'
    
  2. Après cela, faites un git fetch -v

  3. Finalement git checkout the-branch-i-ve-been-looking-for


L'étape 1 peut également être effectuée manuellement en éditant .git/config.

Par exemple, modifiez la ligne suivante de:

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

to (remplacer master par *):

fetch = +refs/heads/*:refs/remotes/Origin/*
133
marlo

Après avoir lu les réponses et le commentaire de @jthill, ce qui me convenait le mieux était d’utiliser le set-branches option sur le git remote commande:

$ 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

Cela modifie la liste des branches suivies par la télécommande nommée afin que nous puissions extraire et extraire uniquement la branche requise.

47
alejandrodnm