git неглибокий клон (clone --depth) пропускає віддалені гілки


99

Після клонування віддаленого сховища воно не відображає жодної віддаленої гілки за допомогою параметра -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є вашим місцевим відділенням. remotes/origin/masterє відповідною віддаленою гілкою. Яке саме питання?
michas

1
Ви, можливо, забули багатослівність? Спробуйтеgit branch -avv
jthill

До michas тощо: ми зазвичай не називаємо master як гілку, вибачте за плутанину. додано "дві віддалені гілки не відображаються". До jthill: дякую за нагадування, ви праві.
minghua

1
Дякую за вступ git clone --depth=1 --no-single-branch, це те, що мені потрібно в більшості випадків.
Аліреза Мохамаді

Відповіді:


62

Поведінка правильна, після останньої редакції головна гілка є (оскільки це 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-option описує:

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

Тому неглибокий клон ( з на глибині -option) тільки вибирає тільки один єдиний філія (у вашій запитаної глибині).


На жаль, обидва варіанти ( --depthі --single-branch) були несправними в минулому, і використання неглибоких клонів призводить до невирішених проблем (як ви можете прочитати за посиланням, яке я розмістив вище), що спричинено даним переписом історії. Це в цілому призводить до дещо складної поведінки в особливих випадках.


1
florianb: яка ваша версія Git? дякую за спробу. Я зробив --depth 1 на 1.7.1 щойно він показує всі віддалені гілки. оновив питання цим. +1 для підтвердження проблеми.
minghua

1
@minghua: Я використовую 1.8.4 - я проведу невелике розслідування, чи не було латки з цим питанням.
Флоріан Нойман,

1
@minghua: я редагував, щоб відобразити нові висновки про "дрібні клони".
Флоріан Нойман,

1
Це майже ідеально, за винятком лише одного: що це означає, кажучи: "власник репо вирішив відрізати інші гілки"? Я думаю, що ці відділення все ще є.
minghua

2
--no-single-branch також клонує всі теги. Ми можемо уникнути цього, створивши нове репо, використовуючи ту саму конфігурацію для отримання всіх пультів, тобто fetch = +refs/heads/*:refs/remotes/origin/*і запуску git fetch --depth 1(без --tags). Ми також можемо додати певні теги для отримання, використовуючи конфігурацію типу fetch = +refs/tags/v2.0.0:refs/tags/v2.0.0.
Сем Уоткінс

208

Зробивши неглибокий клон, щоб мати можливість перевірити інші гілки з віддаленого ,

  1. Виконати (спасибі @jthill):

    git remote set-branches origin '*'
    
  2. Після цього зробіть a 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/*

57
Ви також можете використовувати git remote set-branches origin '*'для всіх гілок, замінити на *ім'я гілки для одного.
jthill

Дякую! Це врятувало мій день.
Стівен Сю

Що -vvvозначає в git fetch -vvv? Я не можу знайти жодної інформації про це в git-fetch doc
gu

@guo це для рівня verbosityабо debugреєстрації git. Це не від fetchметоду.
марло

1
@ kawing-chiu це корисно, якщо у вас так багато гілок, а розмір для "підключення до Інтернету" раніше великий, і тепер ви можете дозволити собі отримати всі ці гілки. :)
марло

62

З прочитання відповідей та коментаря від @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

Це змінює список гілок, відстежуваних названим пультом дистанційного керування, щоб ми могли отримати та перевірити лише потрібну гілку.


15
Можливо, було б краще використовувати git remote set-branches --add origin 'remote_branch_name'так, щоб нова гілка була на додаток до існуючої, а не замінювала їх у списку гілок (або шаблонів гілок) для віддалення у файлі .git / config.
dumbledad

2
OMG, одинарна цитата 'важлива уgit remote set-branches --add origin 'remote_branch_name'
вихідні

@Weekend я не міг отримати цю роботу, поки не залишив одинарні цитати
PandaWood

@PandaWood Ви, мабуть, у Windows. Знак "$" у відповіді означає Bash (на Unix або Cygwin / MSYS).
Йонгвей Ву

Я не бачу нічого про необхідність одинарних лапок у документах, і, здається, це нормально працює без жодного на macOS.
Микола
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.