git shallow clone (клон --depth) пропускает удаленные ветки

После клонирования удаленного репозитория не отображается ни одна удаленная ветвь с параметром -a. В чем может быть проблема? Как это отладить? В этом фрагменте две удаленные ветви не показаны:

$ 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

Пробовал ту же команду на другой машине, она работает хорошо:

$ 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

Пробовал также клонировать еще один репо, все работает хорошо. Хотя я могу попробовать это снова на этой машине, но было бы лучше узнать, что случилось.

Любые предложения или советы будут более чем приветствоваться.

Редактировать: Сводка ответа: Начиная с git версии 1.8.3.2, "--depth" и "--no-single-branch" должны использоваться вместе, чтобы получить то же поведение, что и раньше. Это считается исправлением ошибки.

3 ответа

Решение

Поведение является правильным, после последней ревизии master-ветка (так как это HEAD первичного удаленного) единственная удаленная ветвь в хранилище:

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

Полный клон предлагает новые (все) ветки:

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

Мелкие клоны

Из-за поверхностного описания в технической документации, " git-clone --depth 20 repo [...] результат [s in] цепочек коммитов длиной не более 20."Поэтому мелкий клон должен содержать запрошенную глубину коммитов, начиная с кончика ветви.

Как, кроме того, документация git clone для --single-branch -опция описывает:

"Клонировать только историю, ведущую к вершине одной ветви, либо указанной --branch опция или первичная ветка пульта HEAD указывает на. При создании мелкого клона с --depth вариант, это по умолчанию, если --no-single-branch дается для извлечения истории около кончиков всех ветвей. "

Поэтому неглубокий клон (с параметром глубины) выбирает только одну единственную ветвь (на запрашиваемой глубине).


К сожалению оба варианта (--depth а также --single-branch) были неисправны в прошлом, и использование мелких клонов влечет за собой нерешенные проблемы (как вы можете прочитать в ссылке, которую я разместил выше), которая вызвана переписыванием истории. Это приводит в целом к ​​несколько сложному поведению в особых случаях.

После выполнения мелкого клона, чтобы иметь возможность извлекать другие ветви из удаленного,

  1. Запустить (спасибо @jthill):

    git remote set-branches origin '*'
    
  2. После этого сделайте git fetch -v

  3. в заключение git checkout the-branch-i-ve-been-looking-for


Шаг 1 также можно выполнить вручную, отредактировав .git/config,

Например, измените следующую строку:

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

заменить master с *):

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

После прочтения ответов и комментария от @jthill, мне лучше всего было использовать set-branches вариант на 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

Это изменяет список веток, отслеживаемых именованным удаленным, так что мы можем выбрать и извлечь только нужную ветку.

Другие вопросы по тегам