Подтвердить что ты не робот

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" необходимо использовать вместе, чтобы получить то же поведение, что и раньше. Это считается исправлением ошибки.

4b9b3361

Ответ 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

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

  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/*

Ответ 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://