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
) были неисправны в прошлом, и использование мелких клонов влечет за собой нерешенные проблемы (как вы можете прочитать в ссылке, которую я разместил выше), которая вызвана переписыванием истории. Это приводит в целом к несколько сложному поведению в особых случаях.
После выполнения мелкого клона, чтобы иметь возможность извлекать другие ветви из удаленного,
Запустить (спасибо @jthill):
git remote set-branches origin '*'
После этого сделайте
git fetch -v
в заключение
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
Это изменяет список веток, отслеживаемых именованным удаленным, так что мы можем выбрать и извлечь только нужную ветку.