Как клонировать репозиторий git со всеми ветками?

У меня есть сервер, содержащий репозиторий git с несколькими ветками. Я проверил на сервере git с помощью "git branch -r", и он отображает:
origin/HEAD
origin/develop
origin/neatUI
origin/iOS
... и еще кое-что

Если я клонирую этот репозиторий с помощью: «git clone [path_to_server]/ATS ATS», я получаю репозиторий, содержащий только «разработку». "git branch -a" показывает:
* develop
remotes/origin/HEAD -> origin/develop
remotes/origin/develop

Все остальные ветки отсутствуют.

Если я клонирую репозиторий с параметром --mirror, все ветки присутствуют, но я не могу с ними работать. "git branch -a" показывает:
remotes/origin/HEAD
remotes/origin/develop
remotes/origin/neatUI
remotes/origin/iOS
... и остальные

Если я пытаюсь проверить ветку, git говорит мне: «фатально: эта операция должна выполняться в рабочем дереве».

Я также пробовал "SourceTree" для клонирования репозитория, но SourceTree также создает только ветку "develop".

Кто-нибудь с идеей?


git
person Uwe Andersen    schedule 13.06.2017    source источник
comment
Зеркальный клон — это голый клон, в нем нельзя проверить ветки.   -  person Lasse V. Karlsen    schedule 13.06.2017
comment
У вас есть серверный репозиторий. Вы запускаете git branch -r в этом репо. Запуск git branch -r не отображает ветки в этом репо. В нем перечислены удаленные ветки. Т.е. develop, iOS и neatUI — это ветки в каком-то другом репозитории, из которого был клонирован репозиторий вашего сервера. Чтобы перечислить ветки в репозитории вашего сервера, вы должны запустить только git branch без флага -r.   -  person Alderath    schedule 13.06.2017
comment
ветка git показывает только разработку. Похоже, вы на правильном пути! :) Как я могу добавить другие ветки?   -  person Uwe Andersen    schedule 13.06.2017
comment
Вы можете добавить источник репозитория вашего сервера в качестве удаленного к вашему недавно клонированному репозиторию: git remote add origin2 <url from which your remote repo was cloned> (origin2 здесь просто имя, которое вы можете выбрать как хотите). Затем вы можете получить ветки с этого удаленного git fetch origin2. После этого, если вы выполните git branch -r в своем клонированном репозитории, вы должны увидеть ветки удаленного отслеживания для обоих удаленных репозиториев: origin/develop origin2/develop origin2/neatUI origin2/iOS   -  person Alderath    schedule 13.06.2017
comment
Идеальный! Я должен признать, что я не использовал команды, а реализовал это с помощью git gui. Я решил это в git gui с помощью ›Создать новую ветку ›активировать имя ветки отслеживания совпадений ›Выбрать нужную ветку из списка веток отслеживания. Большое спасибо за указание в правильном направлении!   -  person Uwe Andersen    schedule 13.06.2017


Ответы (3)


Здесь есть несколько отдельных, но взаимосвязанных ключевых понятий.

Во-первых, хотя у Git есть названия веток, это не все, что есть в Git (и в этом отношении термин ветвь неоднозначен: см. также Что именно мы подразумеваем под ветвью?). В Git также есть теги и то, что Git называет названия веток удаленного отслеживания, и все они попадают в общую категорию, называемую ссылки.

  • Имя ветки, такое как master, — это просто ссылка, полное имя которой начинается с refs/heads/.

  • Имя ветки удаленного отслеживания, такое как origin/iOS, представляет собой ссылку, полное имя которой начинается с refs/remotes/, за которым следует имя самой удаленной ветки (origin) и еще одна косая черта. Последняя часть, iOS, это то, что ваш Git обычно копирует из другого Git.

    (Часть remote здесь представляет собой почти произвольную строку. Вы можете придумать свои собственные имена удаленных устройств. Однако тот факт, что к имени удаленного устройства добавляется косая черта, связан с причиной, по которой вы должны будьте осторожны с использованием косой черты в ваших удаленных именах.)

  • Чтобы завершить этот конкретный список, имя тега, такое как v1.0, является просто ссылкой, чье полное имя начинается с refs/tags/. Существует еще больше форм ссылок (refs/notes/ для git notes в Git, а GitHub использует, например, refs/pull/), но ветки, теги и ветки удаленного отслеживания встроены, стандартны и, что наиболее важно, хорошо заметны — так что вы должны знать о них.

Когда вы запускаете git branch, Git находит все ваши имена ссылок refs/heads/ и показывает их с удаленным refs/heads/. Когда вы запускаете git branch -r, Git находит все ваши ссылки refs/remotes/ и показывает их с удаленным refs/remotes/. Когда вы запускаете git branch -a, Git находит оба и показывает первый с удаленным refs/heads/, но показывает второй только с удаленным refs/. (Почему? Кто знает! Это Git шутит. :-))

Это объясняет, почему вы видите то, что видите, а не то, что происходит с git clone --mirror, или почему вы можете git checkout iOS и вдруг получить новый refs/heads/iOS; и для этого нам нужны еще два элемента, о refspecs (используемых с git fetch и git push) и о что Git вызывает DWIM или Do What I Mean в git checkout.

Короче говоря, refspec — это просто пара ссылок, разделенных двоеточием, иногда одна часть которых заменена на *. Например, refs/heads/*:refs/remotes/origin/* — это refspec. Вы также можете добавить перед refspec начальный знак плюс; это устанавливает флаг --force. И git fetch, и git push работают со спецификациями ссылок (и у обоих есть собственный флаг --force, который эффективно добавляет + к любым спецификациям ссылок, которые вы указываете в командной строке). Ссылка перед двоеточием — это источник, а ссылка после двоеточия — назначение, и это важно, поскольку в git fetch задействованы два Git'а. и git push: ваш и некоторые другие Git.

Когда вы git fetch, исходные ссылки являются ссылками других Git, а целевые — вашими. Когда вы git push, исходные ссылки принадлежат вам, а целевые — их.

Использование git clone --mirror говорит вашему Git установить голый репозиторий (который я оставлю здесь неопределенным) и установить +refs/*:refs/* в качестве refspec для git fetch. Это копирует все ссылки из другого Git в origin, но это означает, что вы не можете иметь свои собственные ветки: ваш Git теперь является точной копией их, и каждый раз, когда вы запускаете git fetch, вы заменяете все, что у вас есть с... их точная копия, опять же.

Основной смысл большинства операций git clone – получить неточную копию своего Git. Основная идея здесь заключается в том, что вам нужна вся их ветка. имена, которые станут вашими именами филиалов для удаленного отслеживания. Их master становится вашим origin/master; их iOS становится вашим origin/iOS.

Это не оставляет места для их origin/*, потому что у вашей неточной копии есть свои origin/*. Если вы хотите получить их ветки удаленного отслеживания, вы можете это сделать, но вам нужно дать им другое имя!

Как только у вас есть свой (не зеркальный) клон, а его whatever становится вашим origin/whatever, вы можете git checkout whatever и действие DWIM, о котором я упоминал (и на которое я ссылался) выше, вступает в игру, создавая новый локальный whatever, используя свои собственные origin/whatever, которые вы скопировали из их whatever!

person torek    schedule 13.06.2017

Будьте уверены, если вы клонировали с помощью git clone <url>, все ветки есть в вашем рабочем дереве. Вам просто нужно удалить origin/, когда вы хотите зарегистрироваться в другой ветке. Например, если вы хотите оформить заказ на iOS, выполните git checkout iOS

git branch -r показывает все удаленные ветки в репозитории

git branch -a показывает как удаленные, так и локальные ветки (если вы создали их в своем локальном репо)

person Mayur Nagekar    schedule 13.06.2017
comment
Если я просто клонирую репо (без --mirror), ветки iOS не будет. git checkout iOS выдает ошибку: pathspec 'iOS не соответствует ни одному файлу(ам), известному git.r) - person Uwe Andersen; 13.06.2017
comment
Как вы меняете ветку? - person Mayur Nagekar; 13.06.2017
comment
Как я могу убедиться, что все ветки есть? Как я уже говорил, ветка git -a показывает только разработку... - person Uwe Andersen; 13.06.2017
comment
Если вы видите ветки git branch -r, просто сделайте заказ на ту, которую вы хотите - person Mayur Nagekar; 13.06.2017
comment
Я их не вижу. git branch -r тоже показывает только разработку. - person Uwe Andersen; 13.06.2017
comment
Как вы клонировали репо? - person Mayur Nagekar; 13.06.2017
comment
git clone [путь_к_серверу]/ATS ATS (см. выше) - person Uwe Andersen; 13.06.2017

У меня такая же проблема. Ранее я клонировал свой репозиторий с параметрами --branch <branch-name> или --depth 1.
Это установит запись конфигурации для remote.origin.fetch в значение +refs/heads/<branch-name>:refs/remotes/origin/<branch-name> или +refs/heads/<default-branch>:refs/remotes/origin/<default-branch> соответственно.

<default-branch> обычно будет main или master или в случае OP develop.

Вы можете проверить с помощью этой команды:

git config --get remote.origin.fetch

Замените origin, если ваш пульт называется по-другому, см. git remote -v.

Вы можете обновить настройку с помощью

git config --replace-all remote.origin.fetch +refs/heads/*:refs/remotes/origin/*

Вы также можете отредактировать конфигурацию в настроенном вами редакторе с помощью git config -e.

[remote "origin"]
    url = https://github.com/<some-user>/<some-repo>.git
    fetch = +refs/heads/*:refs/remotes/origin/*

Теперь git fetch должен получить все удаленные ветки (и связанные с ними теги).

Подробности см. в ответе @torek.

person dmtweigt    schedule 29.06.2021