git clone simple (clone --profondeur) manque branches distantes

après avoir cloné un dépôt distant, il n'affiche aucune option branche distante par-A. Quel pourrait être le problème? Comment déboguer? Dans cet extrait, deux des branches distantes ne sont pas affichés:

$ 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, il fonctionne 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

a essayé de cloner un autre repo, ça marche bien. Bien que je puisse l'essayer sur cette machine à nouveau, mais ce serait mieux de savoir ce qui ne va pas.

toute suggestion ou suggestion sera la bienvenue.

Edit: Réponse résumé: Depuis la version git 1.8.3.2 "--profondeur" et "--no-mono-branche" doivent être utilisés ensemble pour obtenir le même comportement qu'avant. Ceci est considéré comme une correction de bug.

46
demandé sur minghua 2014-05-17 10:13:58

3 réponses

le comportement est correct, après la dernière révision la branche maître est (puisqu'il s'agit de la tête de la télécommande primaire) la seule branche distante dans le dépôt:

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

Shallow clones

en Raison de la shallow-description dans la documentation technique, une " git-clone --depth 20 repo [...] résultat[s dans] chaînes de commit d'une longueur maximale de 20."Un clone peu profond doit donc contenir la profondeur de propagation demandée, à partir de l'extrémité d'une branche.

comme-en outre - la documentation de git clone pour le --single-branch - l'option décrit:

"Cloner seulement l'histoire conduisant à l'extrémité d'une seule branche, soit spécifiée par l'option --branch ou par la télécommande de la branche principale HEAD points à. lors de la création d'un clone peu profond avec l'option --depth , c'est la valeur par défaut, à moins que --no-single-branch ne soit donné pour récupérer les histoires près de l'extrémité de toutes les branches. "

Donc un peu clone ( avec le profondeur -option) uniquement récupère seulement une seule branche (à votre demande profondeur.)


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), qui est causé par l'histoire donnée-réécrire. Cela conduit dans l'ensemble à un comportement quelque peu compliqué dans les cas spéciaux.

34
répondu florianb 2014-05-19 18:56:35

après avoir fait un clone peu profond, pour être en mesure de caisse d'autres branches à distance ,

  1. Exécuter (merci @jthill):

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

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


L'Étape 1 peut aussi être effectuée manuellement en l'édition .git/config .

par exemple, changer la ligne de pliage de:

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

à (remplacer master par * ):

fetch = +refs/heads/*:refs/remotes/origin/*
91
répondu marlo 2018-08-15 16:13:39

en lisant les réponses et le commentaire de @jthill, la chose qui a le mieux fonctionné pour moi a été d'utiliser l'option set-branches 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 change la liste des branches suivies par la télécommande nommée afin que nous puissions récupérer et vérifier seulement la branche requise.

33
répondu alejandrodnm 2017-02-07 16:41:01