Git неглубокий клон (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" необходимо использовать вместе, чтобы получить то же поведение, что и раньше. Это считается исправлением ошибки.
Ответы
Ответ 1
Поведение корректно, после последней ревизии главная ветвь (так как это первичный удаленный 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
[...] result [s in] commit цепочки с длиной в большинство 20." Поэтому мелкий клон должен содержать запрошенную глубину фиксации от кончика ветки.
As - кроме того - документация git clone
для --single-branch
-option описывает:
"Клонировать только историю, ведущую к кончику одной ветки, либо указанную опцией --branch
, либо первичным удаленным ветки HEAD
. При создании мелкого клона с опцией --depth
, это значение по умолчанию, если --no-single-branch
не задано для получения истории рядом с кончиками всех ветвей."
Поэтому неглубокий клон ( с глубиной -option) только выбирает только один сингл branch (на заданной глубине).
К сожалению, оба варианта (--depth
и --single-branch
) в прошлом были ошибочными, а использование неглубоких клонов подразумевало нерешенные проблемы (как вы можете прочитать в ссылке, которую я написал выше), что вызвано данной историей -rewrite. Это приводит в целом к довольно сложному поведению в особых случаях.
Ответ 2
После выполнения мелкого клона, чтобы иметь возможность извлекать другие ветки из удаленного,
-
Запустить (спасибо @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/*
Ответ 3
Из чтения ответов и комментария от @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
Это изменяет список ветвей, отслеживаемых именованным удаленным, так что мы можем получить и проверить только требуемую ветвь.
Ответ 4
git clone --depth 1 --no-single-branch ssh://xxx
Почему у меня это предупреждение?
предупреждение: --depth игнорируется в локальных клонах; используйте вместо этого file://