Как клонировать все удаленные ветки в Git?

У меня есть ветка master и development, обе перенесены в GitHub. Я cloned, pulled и fetched, но по-прежнему не могу получить обратно ничего, кроме ветки master.

Я уверен, что упускаю что-то очевидное, но я прочитал руководство и совсем не получаю радости.


person Peter Coulton    schedule 15.09.2008    source источник
comment
В принятом здесь ответе (git branch -a) показаны ветки на пульте дистанционного управления, но если вы попытаетесь проверить любую из них, вы окажетесь в состоянии «отключенной HEAD». Следующий ответ вниз (второй по количеству голосов) отвечает на другой вопрос (а именно: как вытащить все ветки, и, опять же, это работает только для тех, кого вы отслеживаете локально). Некоторые комментарии указывают на то, что вы можете анализировать git branch -a результаты с помощью сценария оболочки, который будет локально отслеживать все удаленные ветки. Резюме: нет собственного способа git делать то, что вы хотите, и в любом случае это может быть не самая лучшая идея.   -  person Day Davis Waterbury    schedule 19.06.2012
comment
Может просто скопировать всю папку по старинке? scp [email protected]:/home/some_user/project_folder ~ Не уверен, работает ли это решение для github ..   -  person snapfractalpop    schedule 27.09.2012
comment
Вместо того, чтобы говорить, что я клонировал, извлекал и извлекал, гораздо лучше показать нам точные команды, которые вы выполнили.   -  person Bob Gilmore    schedule 22.11.2013
comment
@DayDavisWaterbury Здесь, в Git 1.8.3.2, отмеченная ветка не будет находиться в состоянии «отключенная HEAD», но проверенный тег будет.   -  person zeekvfu    schedule 18.05.2014
comment
Вы сможете проверить все ветки (по другому пути) после клонирования репо с новой командой git checkout --to=<path>, входящей в Git 2.5+ (второй квартал 2015 г.): которая будет поддерживать извлечение нескольких веток. См. stackoverflow.com/a/30185564/6309.   -  person VonC    schedule 12.05.2015
comment
Меня всегда удивляет, почему клон не является точной копией. Если это точный клон, не должны ли все ветки быть частью локального репозитория? Я имею в виду, разве не в этом смысл распространения? Поэтому, когда что-то из репозитория пропало, у вас все еще есть полная копия всего. Или так называемые удаленные действительно уже являются частью локального репозитория?   -  person huggie    schedule 11.07.2016
comment
Увидев все положительные голоса, ответы, комментарии к ответам и ошеломляющее количество просмотров, я думаю, что пора git добавить команду для этого. И верно, ты @huggie, в точности мои мысли.   -  person Sнаđошƒаӽ    schedule 29.08.2016
comment
@huggie. По сети пересылается меньше данных только для определенной ветки? Если вы клонируете ядро ​​Linux или какое-то другое чудовище, возможно, это предпочтительнее по умолчанию (хотя я согласен, что если вы хотите это все, это тоже должно быть легко)   -  person Nick T    schedule 28.10.2016
comment
stackoverflow.com/a/7216269/480982 должен быть принятым ответом   -  person Thomas Weller    schedule 18.08.2018
comment
Теперь, когда я давно не узнал о git, я понял, что моя путаница возникла из-за названий удаленных ветвей и удаленных ветвей отслеживания. Git хранит данные в виде дерева. Ветви (будь то удаленные, удаленные отслеживающие или локальные) являются метками для дерева. При клонировании все в дереве клонируется. И все origin/XXXX (удаленные ветки) помечены. (Это действительно местные ярлыки, которые вы держите). Локальная главная ветвь обычно делается ветвью удаленного отслеживания (обратите внимание на черточку, которую я добавил для пояснения). Но вы можете создать другие локальные ветки, которые имеют возможность отслеживания.   -  person huggie    schedule 08.04.2019
comment
Итак, ветки - это ярлыки. Для вас действительно все местные. Удаленная ветка (origin / XXX) - это локальная метка, соответствующая удаленной (самая последняя, ​​которую вы знаете с момента последней выборки). Местное отделение - это местный лейбл. А локальный филиал может иметь возможность отслеживать и становиться ветвью удаленного отслеживания. Возможность отслеживания на самом деле означает, что вы экономите несколько нажатий клавиш, не нужно указывать, какую удаленную ветку вы тянете или нажимаете. Вот и все. Не больше, не меньше. И когда вы клонируете, дерево клонируется, а локальные origin/xxx помечаются.   -  person huggie    schedule 08.04.2019
comment
Кто-нибудь может мне объяснить, в чем разница между git checkout -b master origin/master и git checkout --track origin/master?   -  person aderchox    schedule 18.07.2019
comment
@DayDavisWaterbury, пожалуйста, не относитесь к ответу по SO как к ответу, получившему второе место по количеству голосов. Вместо этого рассмотрите возможность использования имени постера. Количество голосов меняется со временем.   -  person Karl    schedule 30.06.2020
comment
Я считаю, что ключ находится в stackoverflow.com/a/18894949/10020074 Похоже, что git pull действительно тянет ВСЕ ветки к local, все, что вам нужно сделать, это оформить заказ в нужную ветку, и проверка автоматически создаст эту локальную ветку. Это вопрос понимания того, что делают pull и fetch за кулисами.   -  person Daniel Carrera    schedule 28.07.2020


Ответы (43)


Сначала клонируйте удаленный репозиторий Git и cd в него:

$ git clone git://example.com/myproject
$ cd myproject

Затем посмотрите на локальные ветки в вашем репозитории:

$ git branch
* master

Но в вашем репозитории прячутся и другие ветки! Вы можете увидеть это с помощью флага -a:

$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental

Если вы просто хотите быстро взглянуть на ветку восходящего потока, вы можете проверить это напрямую:

$ git checkout origin/experimental

Но если вы хотите работать с этой веткой, вам нужно создать локальную ветку отслеживания, которая выполняется автоматически:

$ git checkout experimental

и ты увидишь

Branch experimental set up to track remote branch experimental from origin.
Switched to a new branch 'experimental'

Здесь новая ветка просто означает, что ветка взята из индекса и создана для вас локально. Как сообщает предыдущая строка, ветвь настраивается для отслеживания удаленной ветки, что обычно означает ветвь origin / branch_name.

Теперь, если вы посмотрите на свои местные филиалы, вы увидите следующее:

$ git branch
* experimental
  master

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

$ git remote add win32 git://example.com/users/joe/myproject-win32-port
$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental
  remotes/win32/master
  remotes/win32/new-widgets

Сейчас все становится довольно сумасшедшим, поэтому запустите gitk, чтобы посмотреть, что происходит:

$ gitk --all &
person emk    schedule 16.09.2008
comment
Как кто-то может автоматически создавать все удаленные ветки, например экспериментальный для происхождения / экспериментальный? - person Cristian Ciupitu; 04.06.2009
comment
Кристиан: Я всегда создавал ветку 'foo' для каждой ветки 'origin / foo', но это приводило к двум проблемам: (1) У меня было много действительно устаревших ветвей отслеживания, которые многие коммиты находились за соответствующей удаленной веткой. и (2) в более старых версиях git при запуске «git push» все мои локальные ветки будут отправлены на удаленный компьютер, даже если эти ветки устарели. Итак, теперь я сохраняю только локальные ветки для вещей, которые я активно разрабатываю, и напрямую обращаюсь к ветвям origin / *, если мне нужна информация о них. (Тем не менее, вы можете использовать сценарий оболочки для анализа 'git branch -a'.) - person emk; 21.07.2009
comment
git fetch ‹origin-name› ‹branch-name› отключает для вас ветку локально. - person ; 07.02.2010
comment
Хороший ответ, но я упускаю из виду вопрос. Я искал однострочник для проверки всех удаленных веток. - person cmcginty; 20.10.2010
comment
Речь шла о клонировании всех удаленных веток, а не о их проверке. И, как я отмечал выше, вы действительно не хотите создавать больше локальных ветвей отслеживания, чем необходимо, потому что, когда они действительно устаревают, они могут вызвать головную боль. - person emk; 28.10.2010
comment
Я столкнулся с проблемой, когда git ответил: fatal: git checkout: обновление путей несовместимо с переключением ветвей. Мне пришлось сначала запустить Git pull, а затем git checkout -b ‹remote_branch› origin / ‹remote_branch› - person gmoore; 24.11.2010
comment
Также обратите внимание, что git fetch без аргументов будет извлекать любые новые удаленные ветки, которые появились после того, как вы его изначально клонировали. В противном случае они могут не появиться при запуске git branch -a. - person J-P; 25.01.2011
comment
чем $ git checkout -b experimental origin/experimental отличается от $ git branch --track experimental origin/experimental? Я понимаю, что касса тоже перейдет в филиал. - person Vaibhav Bajpai; 17.08.2011
comment
@Vaibhav, я понимаю, что касса тоже переключится на ветку: в этом и разница :) - person Kevin C.; 14.09.2011
comment
Вам нужно добавить параметр --track с помощью команды git checkout -b ...? Из справочной документации для git checkout [<branch] похоже, что вы делаете ..._ 3_ - person milesmeow; 09.01.2012
comment
Вам может потребоваться «git remote update» перед тем, как вы «git checkout -b экспериментальное происхождение / экспериментальное», чтобы найти удаленную ветку, более новую по сравнению с вашим локальным репозиторием. - person Parsingphase; 09.05.2012
comment
@milesmeow см. мой комментарий к ответу Люка Паулюссена ниже. Вы можете пропустить --track, когда начинаете с удаленной ветки и используете настройку по умолчанию для branch.autosetupmerge config. - person dubiousjim; 03.07.2012
comment
почему git checkout experimental отличается от git checkout origin/experimental - person Jürgen Paul; 03.08.2012
comment
Полезно добавить подробности к выводу git branch -a, выполнив git branch -av или даже git branch -avv. С повышенным уровнем детализации вы также увидите последнюю фиксацию каждой ветки. - person MarkDBlackwell; 02.12.2013
comment
@PineappleUndertheSea: experimental - ваша локальная ветка, origin/experimental - удаленная ветка. Вы не должны вносить изменения непосредственно в удаленную ветку, поскольку, когда вы git pull или git fetch, ожидается, что удаленная ветка сможет обновиться чисто, чтобы отразить изменения восходящего потока. - person Joe Atzberger; 12.06.2014
comment
Если вы клонировали чистый репозиторий, возможно, вам придется посмотреть ответ Дэйва. Когда я клонировал голое репо, оно не клонировало все ветви. Решение Дэйва позволило мне клонировать все ветки. - person Aust; 06.01.2015
comment
Вместо git checkout -b experimental origin/experimental вы можете написать просто git checkout experimental, он создаст ветку и установит для вас информацию отслеживания (за исключением очень старых версий Git). - person Matthieu Moy; 29.04.2015
comment
@CristianCiupitu Я считаю, что проще всего открыть папку .git/refs в браузере файлов и переместить или скопировать все записи из .git/refs/remotes/origin/* в .git/refs/heads/; все немного менее удобно, когда файлы были перемещены в .git/packed-refs, в этот момент командную строку git было бы проще мультиплексировать - person ThorSummoner; 20.05.2015
comment
Что вы имеете в виду, говоря, что другие ветки прячутся в вашем репозитории! По какой причине они скрыты? Я не понимаю это @emk - person uday; 09.07.2015
comment
@uDaY, скрывая, он имел в виду, что git branch по умолчанию не показывает удаленные ветки, поэтому вам нужно использовать git branch -a, чтобы показать все ветки. - person Katsuke; 26.07.2015
comment
git checkout экспериментальное происхождение / экспериментальное здесь опустите -b, и он покроет ваши потребности за один шаг - person SD.; 05.02.2016
comment
@uDaY - в идеале git clone будет предлагать вам каждую ветку y / n / all вместо того, чтобы «скрывать» их и оставлять вам решать, как получить конкретную ветку на вашем локальном компьютере с еще большим количеством команд и переключателей для расшифровки. Я сказал «клонировать» и дал ему удаленное управление - не только мастер клонирования - но git не совсем догнал уровень легкости / предусмотрительности, который был у нас в DOS в конце 80-х. - person JosephK; 26.07.2016
comment
О программе Но в вашем репозитории прячутся и другие ветки! Это не совсем так. Удаленные ветки НЕ находятся в вашем репозитории, а только в удаленном репозитории. Удалите происхождение для проверки. - person Gustave; 01.03.2018
comment
@Gustave: Тег remotes/origin/experimental фактически указывает на локальную копию origin experimental, обновленную при последнем запуске git fetch. Если вы отключитесь от сети, вы все равно сможете получить доступ к этим данным с помощью git checkout origin/experimental. (Чтобы быть точным, я не проверял в последнее время, но так всегда исторически работало.) - person emk; 02.11.2018
comment
Почему gitk --all &, а не gitk --all? - person Black; 08.03.2019
comment
Я создал этот однострочный файл для проверки и извлечения всех удаленных ветвей: for branch in $(git branch -a); do if echo $branch | grep -q remotes && ! echo $branch | grep -q HEAD; then git checkout "${branch#remotes/origin/}"; git pull; fi; done Проходит по всем ветвям, используя git branch -a, затем фильтрует результаты только с remotes в имени (пропускает все локальные ветки) и отфильтровывает HEAD. Проверяет ветку, используя часть после remotes/origin/, поэтому, если у вас уже есть эта ветка локально, она повторно использует ее, но выполняет git pull. (проверено только с помощью bash) - person Lappro; 13.12.2019
comment
слишком много шума в этом вопросе :( просто сделал это и работал как шарм git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs - person bastami82; 05.09.2020
comment
Хорошо, я изменил свои редакционные права и обновил этот ответ. - person Theodore R. Smith; 21.09.2020
comment
Вы можете добавить, что клон извлекает всю историю. Основная причина, по которой я нашел этот ответ, заключается в том, что я не был уверен в этом. Этот ответ может быть хорошей ссылкой: stackoverflow.com/a/4658547/1366594 - person BrainStorm.exe; 25.03.2021

Если у вас много удаленных веток, которые вы хотите получить сразу, выполните:

$ git pull --all

Теперь вы можете проверить любую ветку по мере необходимости, не обращаясь к удаленному репозиторию.


Примечание. При этом не будут созданы рабочие копии неотмеченных ветвей, о чем и был задан вопрос. Для этого см.

person Gabe Kopley    schedule 13.01.2011
comment
Если я сделаю git clone, у меня будет главная ветка локально и 10 удаленных веток. ЭТОТ ответ Гейба был очень полезным и отвечает на вопрос. - person basZero; 27.01.2012
comment
это извлекает только удаленные ветки, которые были добавлены локально, а не любую удаленную ветку - person jujule; 10.02.2012
comment
Первая команда избыточна. Просто git pull --all будет делать то же самое - просто не получится дважды. И infosec812 прав, что это все равно не дает ответа на вопрос. Интересно, как за это набралось столько голосов. - person Sven Marnach; 06.04.2012
comment
Да, я согласен с @ infosec812 ... Этот ответ не объясняет фактический процесс клонирования / проверки, который выполняется с помощью git checkout -b <localbranch> <remotebranch>, где remotebranch - это имя пульта, которое отображается в git branch -r (или также git branch -a). - person grisaitis; 02.07.2012
comment
После того, как я сделал git remote update, затем попробовал git branch, я вижу только локальные ветки. Но если я сделаю git branch -a, теперь я могу увидеть удаленные ветки и сделать git pull <branchname>, чтобы получить нужную ветку. - Я попал на этот вопрос из поиска Google, и этот ответ решает мою проблему. - person WNRosenberg; 31.01.2013
comment
Это совершенно бесполезно, не тянет никаких удаленных веток, кроме существующих. - person Avinash R; 11.04.2013
comment
Git Pull - все правильно. Это позволило мне подключить удаленные ветки, которые существовали на github, но не в локальном репо, я мог затем переместить эту ветку как обычно - person McDonnellDean; 13.06.2013
comment
Остерегайтесь @Jazzerus. Я думаю, git pull <remotename>/<branchname> объединит эту ветку с любой веткой, которую вы в настоящее время проверяли. Вы хотите git checkout --track <remotename>/<branchname>. И это то, что хочет OP, git checkout --track на всех удаленных (исходных) ветках - person hobs; 10.04.2015
comment
git pull --all или git fetch --all просто выполняет все пульты, а не ветви. - person Geremia; 20.02.2016
comment
@basZero git pull --all;git push remoteUrl2 --all; cd newDir; git clone remoteUrl2; cd repo; git branch -a покажет только главную ветку, поэтому на вопрос нет ответа, так как десятки веток были отброшены. - person user3338098; 13.04.2016
comment
Отметьте этот ответ, он не пытается ответить на исходный вопрос. - person Luís de Sousa; 23.01.2018
comment
Это не первый раз, когда ответ, который просто неверен, потому что он не отвечает на вопрос, получает сотни голосов от людей, которые либо не поняли вопросы и / или ответили, либо получили от Google поиск чего-то другого, как исходная проблема OP, и такой «ответ» случайно ответили на их проблему. К сожалению, нет действительного флага для ответа, который не отвечает на вопрос, единственный способ - это отрицательное голосование, которое, очевидно, не работает в некоторых случаях, поэтому такой шум вот-вот останется навсегда :( - person 9ilsdx 9rvj 0lo; 10.04.2018
comment
Если вы хотите получить все локальные ветки, возьмите hub, затем запустите hub sync - person Leo; 20.08.2019
comment
Это ничего не делает. Если я git clone, то запустите вашу команду, у меня все еще есть только master. - person Theodore R. Smith; 21.09.2020

Мне помог этот сценарий Bash:

#!/bin/bash
for branch in $(git branch --all | grep '^\s*remotes' | egrep --invert-match '(:?HEAD|master)$'); do
    git branch --track "${branch##*/}" "$branch"
done

Он создаст ветки отслеживания для всех удаленных веток, кроме master (который вы, вероятно, получили из исходной команды clone). Я думаю, вам все еще может понадобиться

git fetch --all
git pull --all

быть уверенным.

Один лайнер: git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs
Как обычно: проверьте свою настройку, прежде чем копировать rm -rf universe в том виде, в каком мы ее знаем.

Кредиты за однострочник переходят в cfi пользователя

person bigfish    schedule 21.01.2011
comment
Это действительно близко к идеальному решению ... Единственное, что могло бы улучшить его, - это если бы эта функциональность была встроена в качестве опции в git. - person Deven Phillips; 27.10.2011
comment
изменено: for branch in `git branch -a | sed -n '\=/HEAD$=d; \=/master$=d;s=<SPACE><SPACE>remotes/==p'`; do ... - person dubiousjim; 03.07.2012
comment
Один лайнер: git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs Как обычно: проверьте настройки перед копированием rm -rf universe as we know it - person cfi; 18.09.2012
comment
По моему мнению, вам нужен только git pull --all в конце, поскольку он неявно выполняет выборку? - person Mike Repass; 19.02.2014
comment
Эта команда создает ветки функций удаленно как обычные ветки (а не ветки функций) - как это исправить? - person Alex2php; 20.03.2014
comment
Если у вас возникнут проблемы с / в именах веток, ниже есть решение с использованием псевдонима git. см. ответ none on ответил 15 мая '13 в 11:02 - person wemu; 12.01.2015
comment
@ Alex2php Вам нужно будет отредактировать часть $ {branch ## * /}. Вместо этого я просто обрезал переднюю часть. ($ ветка | вырезать -c 16-) - person Trevor Hickey; 22.04.2015
comment
Я обрезаю только remotes/origin/, чтобы сохранить пространства имен: for BRANCH in $(git branch -a | grep remotes | grep -v HEAD | grep -v master); do git branch --track "${BRANCH#remotes/origin/}" "${BRANCH}"; done - person kgadek; 02.07.2015
comment
Я вижу это в ответе и повторяется в комментариях несколько раз, поэтому я должен упомянуть: git branch -a | grep remotes вместо этого может быть git branch -r (с настройками для более поздних частей, потому что пульты / часть имени ветки отсутствуют в этом выводе) - person Izkata; 09.08.2015
comment
git pull --all или git fetch --all просто выполняет все пульты, а не ветви. Однако ваш bash скрипт работал. - person Geremia; 20.02.2016
comment
Также не забывайте команду push all git push --all origin - person chrismillah; 13.01.2019
comment
просто добавлю свой вкус: git branch -a | grep remotes | grep -v HEAD | rev | cut -d'/' -f1 | rev | xargs -I% git checkout % - person user2066337; 14.05.2020
comment
git checkout "${branch##*/}" будет достаточно для создания ветвей отслеживания вместо git branch --track "${branch##*/}" "$branch" - person Rakib; 06.08.2020
comment
Этот скрипт разбивает имена дочерних веток. Если у меня есть несколько веток, начинающихся с feature/blabla1, feature/blabla2, он получает только blabla1 и blabla2, поэтому вы не можете видеть имя родителя. - person abdullah cinar; 12.03.2021
comment
Чтобы сделать это псевдонимом, просто добавьте: pull-branches = "!git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\\*?\\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\\n)} else {$d{$_}=1}' | csh -xfs #" (некоторые символы нужно было экранировать) в качестве псевдонима в вашем .gitconfig - person Matias; 06.05.2021

Использование параметра --mirror, похоже, правильно копирует ветки отслеживания remote. Однако он настраивает репозиторий как чистый репозиторий, поэтому вам нужно впоследствии превратить его обратно в обычный репозиторий.

git clone --mirror path/to/original path/to/dest/.git
cd path/to/dest
git config --bool core.bare false
git checkout anybranch

Ссылка: Git FAQ: как клонировать все репозитории удаленно отслеживали ветки?

person Dave    schedule 27.08.2011
comment
Вы знаете, что на самом деле это кажется довольно хорошим ответом, хотя у него нет голосов. Есть ли подводные камни в том, чтобы делать это таким образом? Мне пришлось явно проверить ветку после выполнения этих команд. - person loop; 12.01.2012
comment
Согласитесь с @test - я нашел этот ответ очень полезным. У меня были проблемы с репозиторием, где у меня была замена, которая сломала историю, но она работала с этим методом. Большое спасибо за упоминание этого метода, Дэйв! - person oanoss; 18.06.2012
comment
В сочетании с git push --mirror это именно то, что мне нужно для создания точной копии удаленного репозитория git при переходе с github.com на корпоративную установку github. Спасибо! - person Jacob Fike; 12.09.2012
comment
@Dave: добавьте последний git checkout в качестве последней команды, чтобы окончательно проверить заголовок текущей ветки в клонированном репо. Это отличный ответ, безусловно, лучший. Будь храбрым, в конце концов мы доставим тебя на вершину :-) - person cfi; 18.09.2012
comment
@ Дэйв: Хм. У меня есть другие мысли: --mirror делает больше, чем просто настраивает все ветки как отслеживаемые. Он копирует все ссылки из источника, и последующие git remote update сделают это снова. Поведение тяги меняется. Я снова верю, что для полной копии требуется однострочный сценарий. - person cfi; 18.09.2012
comment
git clone --mirror очень хорош для резервного копирования ваших репозиториев git ^ _ ^ - person TrinitronX; 21.05.2013
comment
Если вы намерены создать резервную копию (а не зеркало), я бы вместо этого использовал git-bundle - person onionjake; 02.07.2015
comment
Я хотел репо, идентичное источнику с его происхождением, указывающим на то же место. Поэтому я добавил: cp path/to/original/.git/config path/to/dest/.git/config Похоже, это решает и некоторые другие проблемы, связанные с запуском с чистого репо. - person Tongfa; 26.04.2016
comment
При использовании этих шагов мой интерфейс командной строки меняется с [master] на [GIT_DIR!], и окончательная проверка не работает. ОБНОВЛЕНИЕ: Я ошибся. Я клонировал в /path/to/dest.git - должно было быть /path/to/dest/.git. Затем, когда я деконфигурировал пустой режим, мой интерфейс командной строки сказал [master +0 ~0 -116 ~], но на git checkout master он выполнил кучу работы, но с другой стороны вышел как [master], так что похоже, что успех! - person Max Cascone; 15.08.2017
comment
Я запутался в части path/to/dest/.git и оставил ее в стороне. Пришлось mkdir x; mv x.git x/.git; cd x; git config --bool core.bare false восстанавливать. В противном случае да, это решение. Спасибо. - person Giszmo; 01.09.2017
comment
Эта опция работает без необходимости в описанной выше магии скриптов. - person Bernd Jungblut; 25.05.2018
comment
Предупреждение, он не клонирует объединенные ветки. Но кроме этого, он делает свою работу! - person Kusan; 23.10.2018
comment
Я обнаружил еще одно различие между clone и clone --mirror (stackoverflow.com/a/3960063/4336225), так что если я хотите работать над этим зеркальным клонированным репо. Мне также 1) нужно запустить git config --bool core.logallrefupdates true, потому что core.logallrefupdates по умолчанию ложен в чистом репозитории (или зеркальном репозитории). ссылка: git-scm.com/docs/git-config. 2) раздел выборки в файле конфигурации также необходимо изменить с fetch = + refs / *: refs / * на fetch = + refs / Head / *: refs / remotes / origin / *. в противном случае git fetch не будет работать так же, как обычно клонированное репо. - person halfmoonhalf; 23.04.2020
comment
Мне пришлось сделать это, чтобы иметь возможность вернуться к источнику. - person jarno; 13.10.2020
comment
исправление: git config --bool core.logAllRefUpdates true (заглавные буквы) - person Devin Rhode; 26.06.2021

Вы можете легко переключиться на ветку без использования причудливого синтаксиса git checkout -b somebranch origin / somebranch. Ты можешь сделать:

git checkout somebranch

Git автоматически поступит правильно:

$ git checkout somebranch
Branch somebranch set up to track remote branch somebranch from origin.
Switched to a new branch 'somebranch'

Git проверит, существует ли ветка с таким же именем точно на одном удаленном компьютере, и если это так, он отслеживает ее так же, как если бы вы явно указали, что это удаленная ветка. На странице руководства git-checkout Git 1.8.2.1:

Если ‹branch› не найден, но существует ветвь отслеживания ровно на одном пульте (назовите его ‹remote›) с совпадающим именем, рассматривать как эквивалент

$ git checkout -b <branch> --track <remote>/<branch>
person Nikos C.    schedule 12.05.2012
comment
Итак, если имя ветки, которую вы checkout, идентично имени удаленной ветки, все после /, тогда git создаст ветку с тем же именем, все после /, отслеживая этот удаленный? А под отслеживанием мы имеем в виду: git push, git pull и т. Д. Будут ли выполняться на этом пульте? Если это верно, то расширьте свой ответ дополнительной информацией, поскольку я согласен с @Daniel, этот ответ заслуживает большей репутации. - person Gerard Roche; 15.06.2012
comment
@BullfrogBlues, ответ на все ваши вопросы - да (я использую git v1.7.7.4). Я согласен, что это поведение должно быть лучше известно. (Этого нет в руководстве для этой версии git.) Мне на самом деле не нравится такое поведение, я бы предпочел получить сообщение об ошибке и сказать git checkout --track origin/somebranch явно. - person dubiousjim; 03.07.2012
comment
@dubiousjim: Собственно, это есть в руководстве. git-checkout (1) говорит: Если ‹branch› не найден, но существует ветка отслеживания ровно на одном пульте (назовите его ‹remote›) с совпадающим именем, рассматривать как эквивалент 'git checkout -b ‹branch› --track ‹remote› / ‹branch› »(Git V.1.8.1.1). - person sleske; 27.02.2013
comment
Что нам нужно, так это $ git pull * ‹remote› / *, где * - это подстановочный знак, поэтому он извлекает все ветки, включая те, которые еще не находятся в локальной системе. Как это сделать? Неужели мы действительно должны проверять / извлекать каждую ветку только для того, чтобы получить код в нашей локальной системе? - person JosephK; 19.02.2017
comment
Для меня наиболее важно, что если его не существует, оно не создает его. - person Joe Johnston; 03.12.2020

Касательно,

$ git checkout -b экспериментальное происхождение / экспериментальное

с использованием

$ git checkout -t origin/experimental

или более подробный, но более легкий для запоминания

$ git checkout --track origin/experimental

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

person murphytalk    schedule 27.07.2009
comment
Значит, вы имеете в виду, что вторую форму легче запомнить и другой разницы нет? - person aderchox; 18.07.2019

Выполняемая выборка должна получить все удаленные ветки, но не будет создавать для них локальные ветки. Если вы используете gitk, вы должны увидеть удаленные ветки, описанные как «remotes / origin / dev» или что-то подобное.

Чтобы создать локальную ветку на основе удаленной ветки, сделайте что-нибудь вроде:

git checkout -b dev refs/remotes/origin/dev

Что должно вернуть что-то вроде:

Branch dev set up to track remote branch refs/remotes/origin/dev.
Switched to a new branch "dev"

Теперь, когда вы находитесь в ветке dev, «git pull» обновит ваш локальный dev до той же точки, что и удаленная ветка dev. Обратите внимание, что он будет извлекать все ветви, но тянет только ту, на которой вы находитесь, на вершину дерева.

person Luuk Paulussen    schedule 15.09.2008
comment
Здесь вам не нужны ссылки / пульты. git checkout -b dev origin / dev будет работать нормально. - person emk; 17.09.2008
comment
Это всегда будет работать: git checkout -b newlocaldev --track origin/dev. Если вы хотите, чтобы локальная ветка имела то же имя, что и удаленная, а удаленная ветка не имела сложного имени, вы можете опустить -b newlocaldev. С настройкой конфигурации по умолчанию branch.autosetupmerge и при условии, что у вас нет локальной ветки с именем dev, эти две команды могут делать то же самое: git checkout -b dev origin/dev и просто git checkout dev. Наконец, git checkout origin/dev не создает новую ветку, а просто переводит вас в состояние отсоединения HEAD. - person dubiousjim; 03.07.2012
comment
Что произойдет, если пульта ДУ больше не существует, но Git слишком глуп, чтобы признать его удаленным? Предполагается, что вы обновили, и git branch -a продолжает указывать его как удаленную ветку. - person jww; 20.09.2016
comment
И делаем это для десятков филиалов? - person JosephK; 19.02.2017

Используйте псевдонимы. Хотя в Git нет встроенных однострочников, вы можете определить свой собственный как

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'

а затем используйте его как

git clone-branches
person nobody    schedule 15.05.2013
comment
Спасибо. Это фактически клонирует все удаленные ветки, в отличие от некоторых других ответов - person FearlessHyena; 14.05.2020

Когда вы выполняете «git clone git: // location», выбираются все ветки и теги.

Чтобы работать поверх определенной удаленной ветки, предполагая, что это удаленный источник:

git checkout -b branch origin/branchname
person elmarco    schedule 15.09.2008
comment
Я ценю ваше замечание, что все ветки и теги извлекаются. Я собирался прокомментировать ваш неправильный ответ, но потом проверил его и обнаружил, что вы совершенно правы. В каком-то смысле вы дали самый короткий ответ - если вы клонировали, он у вас уже есть. Отлично. Можно попробовать добавить: попробуйте $ git branch -a узнать, какие удаленные ветки уже доступны. - person Jan Vlcinsky; 18.11.2013
comment
Взгляните на ответ, который я опубликовал. Это может быть полезно, если вы знаете, что хотите работать локально со многими удаленными ветвями, и вам не нужно проверять их одну за другой. - person lacostenycoder; 08.12.2018
comment
Не могли бы вы объяснить мне, в чем разница между git checkout -b master origin/master и git checkout --track origin/master, пожалуйста? - person aderchox; 18.07.2019
comment
@aderchox В настоящее время я думаю, что нет. - person elmarco; 02.08.2019

Лучше поздно, чем никогда, но вот лучший способ сделать это:

mkdir repo
cd repo
git clone --bare path/to/repo.git .git
git config --unset core.bare
git reset --hard

На данный момент у вас есть полная копия удаленного репо со всеми его ветвями (проверьте с помощью git branch). Вы можете использовать --mirror вместо --bare, если ваше удаленное репо имеет собственные пульты.

person Jacob Fike    schedule 26.11.2012
comment
При редактировании здесь что-то пошло не так. Теперь этот ответ не имеет смысла. --bare, упомянутый в последнем предложении, не существует в данном списке команд. - person Cerran; 05.03.2014
comment
взяв из ответа Дэйва ниже. Использование git config --bool core.bare false вместо git config unset core.bare, похоже, делает свою работу. - person Confused Vorlon; 28.10.2014
comment
У меня есть error: key does not contain a section: unset. Ответ Дэйва работает лучше. - person oHo; 19.10.2015
comment
На самом деле это git config --unset core.bare ... Мне это кажется самым чистым решением из всех представленных здесь ответов. Жаль, что у него так мало голосов ... - person Dirk Hillbrecht; 10.05.2017
comment
У меня сработало ... @olibre попробуйте git config --bool core.bare false вместо git config --unset core.bare - person Chris Sim; 29.06.2017
comment
Спасибо @ChrisSim Я согласен на git config --bool core.bare false. Вот почему я рекомендую вместо этого ответ Дэйва. Что вы думаете об ответе Дэйва? Ваше здоровье - person oHo; 29.06.2017
comment
Это абсолютно лучший ответ, за исключением того, что @FedericoCapaldo дал ответ, в котором немного подробнее о том, что именно делают эти команды. - person unrivaledcreations; 05.08.2017

Почему вы видите только "хозяин"

git clone загружает все удаленные ветки, но по-прежнему считает их «удаленными», даже если файлы находятся в вашем новом репозитории. Есть одно исключение из этого, а именно то, что процесс клонирования создает локальную ветвь с именем «master» из удаленной ветки с именем «master». По умолчанию git branch показывает только локальные ветки, поэтому вы видите только «master».

git branch -a показывает все ветви, включая удаленные ветви.


Как попасть в местные отделения

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

git branch branchone origin/branchone
git branch branchtwo origin/branchtwo
git branch branchthree origin/branchthree

В этом примере branchone - это имя локальной ветки, которую вы создаете на основе origin/branchone; если вместо этого вы хотите создать локальные ветки с разными именами, вы можете сделать это:

git branch localbranchname origin/branchone

Создав локальную ветку, вы можете увидеть ее с помощью git branch (помните, вам не нужно -a, чтобы увидеть локальные ветки).

person Cerran    schedule 05.03.2014
comment
Если origin/branchone существует, вы также можете просто использовать git checkout branchone, чтобы создать локальную ветку с тем же именем и настроить ее для отслеживания удаленных. - person Evan; 15.05.2020

Это не слишком сложно, очень простые и понятные шаги заключаются в следующем;

git fetch origin Это перенесет все удаленные ветки на ваш локальный.

git branch -a Это покажет вам все удаленные ветки.

git checkout --track origin/<branch you want to checkout>

Убедитесь, что вы находитесь в нужной ветке, с помощью следующей команды;

git branch

Результат будет таким;

*your current branch 
some branch2
some branch3 

Обратите внимание на знак *, обозначающий текущую ветвь.

person Sam    schedule 26.12.2013
comment
Спасибо, сурадж. Причина в том, что за него мало кто голосовал. И ответ не принимается спрашивающим. - person Sam; 08.06.2015
comment
Источник git fetch не привел ни одну из удаленных веток к моему локальному - или они где-то спрятаны? От прочтения всех приведенных выше ответов у меня заболела голова. Мы ищем git, чтобы получить все ветки в local. Для этого должен быть какой-то способ помимо bash-скриптов. - person JosephK; 02.05.2016
comment
Сразу после того, как вы выполните git fetch origin, он покажет такой вывод в вашем терминале - * [new branch] branch_name - ›origin / branch_name, но когда вы запустите git branch, вместо этого он покажет вам только ваши локальные ветки, чтобы увидеть все ветки вы можете выполнить git branch -a, а затем, чтобы переключиться на удаленную ветку, вам нужно запустить git checkout --track origin / ‹ветку, которую вы хотите проверить›. Надеюсь это поможет. :-) - person Sam; 09.06.2016
comment
Сурадж, потому что вопрос был в том, как клонировать все удаленные ветки, а не как вручную обновлять по одной. Похоже, что на настоящий вопрос нет ответа - просто способы много печатать, если у вас много веток. - person JosephK; 19.02.2017

Просто сделай это:

$ git clone git://example.com/myproject
$ cd myproject
$ git checkout branchxyz
Branch branchxyz set up to track remote branch branchxyz from origin.
Switched to a new branch 'branchxyz'
$ git pull
Already up-to-date.
$ git branch
* branchxyz
  master
$ git branch -a
* branchxyz
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/branchxyz
  remotes/origin/branch123

Видите ли, 'git clone git: //example.com/myprojectt' извлекает все, даже ветки, вам просто нужно проверить их, тогда будет создана ваша локальная ветка.

person rapher    schedule 31.05.2011

Вам нужно только использовать «git clone», чтобы получить все ветки.

git clone <your_http_url>

Несмотря на то, что вы видите только главную ветку, вы можете использовать «git branch -a», чтобы увидеть все ветки.

git branch -a

И вы можете переключиться на любую ветку, которая у вас уже есть.

git checkout <your_branch_name>

Не волнуйтесь, что после "git clone" вам не нужно подключаться к удаленному репо, "git branch -a" и "git checkout" могут быть успешно запущены при закрытии Wi-Fi. Итак, доказано, что когда вы выполняете «git clone», он уже скопировал все ветки из удаленного репо. После этого вам не понадобится удаленное репо, у вашего локального уже есть коды всех веток.

person Haimei    schedule 19.11.2014
comment
Здесь очень четкий ответ. Многие люди запутались в этой теме. - person XMAN; 21.10.2018
comment
Я хотел бы, чтобы ваше утверждение могло быть успешно выполнено, когда вы закрываете свой Wi-Fi. git clone действительно приводит к репо, содержащему все ветки. - person bvgheluwe; 28.02.2019

git clone должен копировать весь репозиторий. Попробуйте клонировать его, а затем запустите git branch -a. В нем должны быть перечислены все ветки. Если вы хотите переключиться на ветку «foo» вместо «master», используйте git checkout foo.

person MattoxBeckman    schedule 15.09.2008
comment
Команды git можно запускать с дефисом или без него. И git-branch, и git branch будут работать. - person Peter Boughton; 16.09.2008
comment
Возможно, этот ответ был дан давно, когда git работал по-другому, но сегодня я думаю, что он вводит в заблуждение. git clone загружает все удаленные ветки, но создает только локальную ветку master. Поскольку git branch показывает только локальные ветки, вам также нужно git branch -a, чтобы видеть удаленные ветки. - person Cerran; 05.03.2014
comment
Спасибо. Это какое-то странное поведение по умолчанию IMO. Я просто спишу это на более загадочную мерзость. Если он загрузил ветки, зачем ему скрывать их при вызове ветки git? - person Adam Hughes; 26.10.2016
comment
@Cerran, спасибо; Я соответствующим образом обновил свой ответ. - person MattoxBeckman; 28.10.2017
comment
загружает все удаленные ветки, но создает только локальную ветвь мастера. Мне нужна помощь в понимании этого. Кажется, что git clone НЕ клонирует какие-либо ветки, кроме master, так как когда вы выполняете git branch -a, он показывает, что ветка разработки находится только в remotes / origin / develop. Это должно означать, что у вас нет этой ветки нигде локально, она существует только в настоящее время в источнике, верно? - person John Little; 23.01.2018
comment
Я думаю, что @Cerran хотел сказать, что загружает все ИМЕНА удаленных веток - person Devin Rhode; 26.06.2021

все ответы, которые я здесь видел, действительны, но есть гораздо более чистый способ клонировать репозиторий и вытащить все ветки сразу.

Когда вы клонируете репозиторий, вся информация о ветках фактически загружается, но ветви скрыты. С командой

$ git branch -a

вы можете показать все ветки репозитория, а с помощью команды

$ git checkout -b branchname origin/branchname

затем вы можете «загружать» их вручную по одному.


Однако, когда вы хотите клонировать репо с большим количеством ветвей, все способы, показанные выше, являются длинными и утомительными по сравнению с гораздо более чистым и быстрым способом, который я собираюсь показать, хотя он немного сложен. Для этого вам потребуется три шага:

  1. Первый шаг

создайте новую пустую папку на вашем компьютере и клонируйте зеркальную копию папки .git из репозитория:

$ cd ~/Desktop && mkdir my_repo_folder && cd my_repo_folder
$ git clone --mirror https://github.com/planetoftheweb/responsivebootstrap.git .git

локальный репозиторий внутри папки my_repo_folder все еще пуст, теперь есть только скрытая папка .git, которую вы можете увидеть с помощью команды «ls -alt» из терминала.

  1. Второй шаг

переключите этот репозиторий из пустого (голого) репозитория в обычный репозиторий, переключив логическое значение "bare" конфигураций git на false:

$ git config --bool core.bare false
  1. Третий шаг

Возьмите все, что находится внутри текущей папки, и создайте все ветки на локальном компьютере, поэтому сделайте это обычным репо.

$ git reset --hard

Итак, теперь вы можете просто ввести команду «git branch», и вы увидите, что все ветки загружены.

Это быстрый способ клонирования репозитория git со всеми ветвями сразу, но это не то, что вы хотите делать таким образом для каждого отдельного проекта.

person FedericoCapaldo    schedule 06.12.2015
comment
Мне не нравится, что вы употребляете слово "загружать" в ... загружать их вручную по одному. Фактически, вся информация уже загружена после клонирования репо. Единственное, что нужно сделать, это создать локальные ветки отслеживания (что также возможно в автономном режиме, что доказывает, что вся информация находится в репо). - person bvgheluwe; 28.02.2019
comment
@bvgheluwe, поэтому он в кавычках. - person FedericoCapaldo; 05.03.2019

Воспользуйтесь моим инструментом git_remote_branch (вам понадобится Ruby установлен на вашем компьютере). Он создан специально, чтобы упростить удаленные манипуляции с ветвями.

Каждый раз, когда он выполняет операцию от вашего имени, он выводит ее на консоли красным цветом. Со временем они окончательно застряли в вашем мозгу :-)

Если вы не хотите, чтобы grb запускал команды от вашего имени, просто используйте функцию «объяснять». Команды будут выводиться на консоль, а не выполняться за вас.

Наконец, у всех команд есть псевдонимы, чтобы упростить запоминание.

Обратите внимание, что это альфа-версия; - )

Вот справка при запуске grb help:

git_remote_branch version 0.2.6

  Usage:

  grb create branch_name [origin_server] 

  grb publish branch_name [origin_server] 

  grb rename branch_name [origin_server] 

  grb delete branch_name [origin_server] 

  grb track branch_name [origin_server] 



  Notes:
  - If origin_server is not specified, the name 'origin' is assumed 
    (git's default)
  - The rename functionality renames the current branch

  The explain meta-command: you can also prepend any command with the 
keyword 'explain'. Instead of executing the command, git_remote_branch 
will simply output the list of commands you need to run to accomplish 
that goal.

  Example: 
    grb explain create
    grb explain create my_branch github

  All commands also have aliases:
  create: create, new
  delete: delete, destroy, kill, remove, rm
  publish: publish, remotize
  rename: rename, rn, mv, move
  track: track, follow, grab, fetch
person webmat    schedule 20.09.2008
comment
Слово мудрым: похоже, этот проект был заброшен примерно в то время, когда был опубликован этот ответ. Я не могу найти никаких обновлений после 2008 года. Caveat emptor и все такое. Если я ошибаюсь, я надеюсь, что кто-то отредактирует и предоставит текущий указатель, потому что мне бы хотелось иметь такой инструмент под рукой. - person bradheintz; 28.04.2011
comment
@bradheintz проверьте этот ответ, он устанавливает псевдоним git: stackoverflow.com/a/16563327/151841 - person user151841; 19.04.2019

Автономный репозиторий

Если вы ищете автономный клон или резервную копию, который включает все удаленные ветки и журналы фиксации, используйте:

git clone http://[email protected]
git pull --all

Принятый ответ git branch -a только показывает удаленные ветви. Если вы попытаетесь checkout открыть филиалы, вы не сможете это сделать, если у вас все еще нет сетевого доступа к исходному серверу.

Кредит: Гейба Копли за предложение использовать git pull --all.

Примечание.
Конечно, если у вас больше нет сетевого доступа к серверу remote/origin, remote/origin branches не будет иметь обновлений, отраженных в их. Их изменения будут отражать коммиты с даты и времени, когда вы выполнили 2 команды, указанные выше.


Checkout a *local* branch in the usual way with `git checkout remote/origin/` Use `git branch -a` to reveal the remote branches saved within your `clone` repository.

Чтобы извлечь ВСЕ ваши клонированные ветки в локальные ветки с помощью одной команды, используйте одну из команд bash ниже:

$ for i in $(git branch -a |grep 'remotes' | awk -F/ '{print $3}' \ 
| grep -v 'HEAD ->');do git checkout -b $i --track origin/$i; done

OR

Если в вашем репо есть вложенные ветки, эта команда учтет это:

for i in $(git branch -a |grep 'remotes' |grep -v 'HEAD ->');do \
basename ${i##\./} | xargs -I {} git checkout -b {} --track origin/{}; done

Приведенные выше команды checkout создадут локальную ветвь в вашем локальном репозитории git, названную так же, как remote/origin/<branchname>, и установят для нее --track изменения из удаленной ветки на сервере remote/origin, если вы восстановите сетевой доступ к исходному серверу репозитория еще раз и выполните команду git pull обычным способом.

person Tony Barganski    schedule 25.09.2019
comment
Это то, зачем я ее пришел! - person Blake Yarbrough; 16.07.2020

Клонирование из локального репо не будет работать с git clone и git fetch: многие ветки / теги останутся невытянутыми.

Получить клон со всеми ветками и тегами.

git clone --mirror git://example.com/myproject myproject-local-bare-repo.git

Чтобы получить клон со всеми ветками и тегами, а также с рабочей копией:

git clone --mirror git://example.com/myproject myproject/.git
cd myproject
git config --unset core.bare
git config receive.denyCurrentBranch updateInstead
git checkout master
person raisercostin    schedule 23.02.2017

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

for branch in  `git branch -r | grep -v 'HEAD\|master'`; do  
 git branch --track ${branch##*/} $branch;
done

Но будьте осторожны, если одна из удаленных веток названа, например, admin_master он не будет загружен!

Спасибо bigfish за оригинальную идею

person Tebe    schedule 19.02.2015
comment
Вы можете улучшить регулярное выражение или, возможно, использовать Awk вместо grep, чтобы улучшить фильтр и избежать ложных срабатываний. - person tripleee; 04.11.2015
comment
все ветки имеют "origin \ my_branch_name", что не совсем то, что я хочу. - person Sнаđошƒаӽ; 01.09.2016
comment
Я не видел раньше конструкцию $ {branch ## * /} - выглядит действительно полезно - есть идеи, где я могу узнать об этом больше? не могу найти нигде под bash. Спасибо. - person SaminOz; 07.05.2017

Хорошо, когда вы клонируете свое репо, у вас есть все ветки ...

Если вы просто делаете git branch, они как бы спрятаны ...

Поэтому, если вы хотите видеть имена всех веток, просто добавьте флаг --all следующим образом:

git branch --all or git branch -a

Если вы просто зарегистрируетесь в филиале, вы получите все, что вам нужно.

Но как насчет того, чтобы ветка была создана кем-то другим после того, как вы клонировали?

В этом случае просто выполните:

git fetch

и еще раз проверим все ветки ...

Если вы хотите получать и оформлять заказ одновременно, вы можете:

git fetch && git checkout your_branch_name

Также создал изображение ниже, чтобы вы упростили то, что я сказал:

git branch --all, чтобы получить все ветки

person Alireza    schedule 22.07.2017
comment
Есть разница между тем, что у вас есть, и вы это видите. git branch -all больше НЕ будет отображать удаленные ветки при удалении удаленного репозитория. - person Gustave; 01.03.2018

#!/bin/bash
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
   git branch --track ${branch#remotes/origin/} $branch
done

Этот код перенесет весь код удаленных веток в локальное репо.

person Albert.Qing    schedule 11.12.2016

Для копирования и вставки в командную строку:

git checkout master ; remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do git branch -D $brname ; git checkout -b $brname $remote/$brname ; done ; git checkout master

Для большей читаемости:

git checkout master ;
remote=origin ;
for brname in `
    git branch -r | grep $remote | grep -v master | grep -v HEAD 
    | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'
`; do
    git branch -D $brname ;
    git checkout -b $brname $remote/$brname ;
done ;
git checkout master


Это будет:

  1. проверить мастер (чтобы мы могли удалить ветку, в которой мы находимся)
  2. выберите удаленный, чтобы оформить заказ (измените его на любой имеющийся у вас пульт)
  3. loop through all branches of the remote except master and HEAD
    1. delete local branch (so that we can check out force-updated branches)
    2. проверить ветку с пульта дистанционного управления
  4. проверить мастера (ради него)

На основе ответа на VonC.

person ikaruss    schedule 20.12.2013

Ни один из этих ответов не повлиял на ситуацию, кроме пользователя: никто не на правильном пути.

У меня возникли проблемы с перемещением репо с одного сервера / системы на другой. Когда я клонировал репо, он создавал только локальную ветвь для мастера, поэтому, когда я нажимал на новый пульт, была нажата только главная ветка.

Я нашел эти два метода ОЧЕНЬ полезными. Надеюсь, они помогут кому-то другому.

Метод 1:

git clone --mirror OLD_REPO_URL
cd new-cloned-project
mkdir .git
mv * .git
git config --local --bool core.bare false
git reset --hard HEAD
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo

Метод 2:

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'
git clone OLD_REPO_URL
cd new-cloned-project
git clone-branches
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo
person Gaui    schedule 23.01.2015

Я написал эти небольшие функции Powershell, чтобы иметь возможность проверять все мои ветки git, которые находятся на удаленном источнике.

Function git-GetAllRemoteBranches {
     iex "git branch -r"                       <# get all remote branches #> `
     | % { $_ -Match "origin\/(?'name'\S+)" }  <# select only names of the branches #> `
     | % { Out-Null; $matches['name'] }        <# write does names #>
}


Function git-CheckoutAllBranches {
    git-GetAllRemoteBranches `
        | % { iex "git checkout $_" }          <# execute ' git checkout <branch>' #>
}

Дополнительные функции git можно найти в моем репозитории настроек git

person gringo_dave    schedule 19.06.2016

Вот ответ, в котором используется awk. Этого метода должно хватить, если он используется в новом репо.

git branch -r | awk -F/ '{ system("git checkout " $NF) }'

Существующие ветки будут просто извлечены или объявлены как уже существующие, но могут быть добавлены фильтры, чтобы избежать конфликтов.

Его также можно изменить, чтобы он вызывал явную команду git checkout -b <branch> -t <remote>/<branch>.

Этот ответ следует за ответом Никоса С. идея.


В качестве альтернативы мы можем указать удаленную ветку. Это основано на murphytalk ответ.

git branch -r | awk '{ system("git checkout -t " $NF) }'

Он выдает сообщения о фатальных ошибках при конфликтах, но я считаю их безвредными.


Обе команды могут иметь псевдонимы.

Используя никто ответ в качестве справки, у нас могут быть следующие команды для создания псевдонимов:

git config --global alias.clone-branches '! git branch -r | awk -F/ "{ system(\"git checkout \" \$NF) }"'
git config --global alias.clone-branches '! git branch -r | awk "{ system(\"git checkout -t \" \$NF) }"'

Лично я бы использовал track-all или track-all-branches.

person konsolebox    schedule 20.06.2019
comment
Просто хотел вас поблагодарить. Это сработало отлично и не страдает от различных проблем, связанных с клонированием чистого репо, таких как изменение поведения вытягивания и т. Д. - person mahonya; 16.12.2019

git clone --mirror в исходном репо хорошо подходит для этого.

git clone --mirror /path/to/original.git
git remote set-url origin /path/to/new-repo.git
git push -u origin
person Bernd Jungblut    schedule 25.05.2018
comment
Самый простой способ клонировать все ветки! - person david.perez; 22.07.2021

Мне нужно было сделать то же самое. Вот мой сценарий Ruby.

#!/usr/bin/env ruby

local = []
remote = {}

# Prepare
%x[git reset --hard HEAD]
%x[git checkout master] # Makes sure that * is on master.
%x[git branch -a].each_line do |line|
  line.strip!
  if /origin\//.match(line)
     remote[line.gsub(/origin\//, '')] = line
   else
     local << line
   end
end
# Update 
remote.each_pair do |loc, rem|
  next if local.include?(loc)
  %x[git checkout --track -b #{loc} #{rem}]
end
%x[git fetch]
person user43685    schedule 10.12.2010
comment
См. Ответ, который я разместил ниже, чтобы вообще не запускать этот скрипт. - person lacostenycoder; 08.12.2018

Вот еще одна короткая однострочная команда, которая создает локальные ветки для всех удаленных веток:

(git branch -r | sed -n '/->/!s#^  origin/##p' && echo master) | xargs -L1 git checkout

Он также работает правильно, если уже созданы отслеживающие локальные ветки. Вы можете вызвать его после первого git clone или в любое время позже.

Если вам не нужно извлекать master ветку после клонирования, используйте

git branch -r | sed -n '/->/!s#^  origin/##p'| xargs -L1 git checkout
person jofel    schedule 10.09.2015

Git обычно (если не указан) выбирает все ветки и / или теги (ссылки, см .: git ls-refs) из одного или нескольких других репозиториев вместе с объектами, необходимыми для завершения их истории. Другими словами, он выбирает объекты, доступные для уже загруженных объектов. См .: Чем на самом деле git fetch?

Иногда у вас могут быть ветки / теги, которые напрямую не связаны с текущим, поэтому _3 _ / _ 4_ в этом случае не поможет, но вы можете перечислить их:

git ls-remote -h -t origin

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

Итак, чтобы получить их все, попробуйте:

git fetch origin --depth=10000 $(git ls-remote -h -t origin)

Параметр --depth=10000 может помочь, если вы сделали репозиторий неглубоким.

Затем снова проверьте все свои ветки:

git branch -avv

Если это не поможет, вам нужно вручную добавить недостающие ветки в отслеживаемый список (так как они как-то потерялись):

$ git remote -v show origin
...
  Remote branches:
    master      tracked

от git remote set-branches нравится:

git remote set-branches --add origin missing_branch

поэтому он может отображаться под remotes/origin после выборки:

$ git remote -v show origin
...
  Remote branches:
    missing_branch new (next fetch will store in remotes/origin)
$ git fetch
From github.com:Foo/Bar
 * [new branch]      missing_branch -> origin/missing_branch

Исправление проблем

Если вы по-прежнему не можете получить ничего, кроме основной ветки, проверьте следующее:

  • Double check your remotes (git remote -v), e.g.
    • Validate that git config branch.master.remote is origin.
    • Проверьте, указывает ли origin на правильный URL через: git remote show origin (см. Этот пост).
person kenorb    schedule 31.03.2016

По состоянию на начало 2017 года ответ в этом комментарии работает:

git fetch <origin-name> <branch-name> приносит вам ветку. Хотя это не приводит к одновременному извлечению всех ветвей, вы можете выполнять эту операцию по отдельности для каждой ветки.

person ashes999    schedule 21.04.2017
comment
Это требует, чтобы вы загружали каждую ветвь по очереди. Не очень хорошо, если у вас много веток. - person lacostenycoder; 08.12.2018

Используйте команды, которые вы можете запомнить

Я использую Bitbucket, службу хостинга репозиториев Atlassian. Поэтому я стараюсь следовать их документам. И это отлично работает для меня. С помощью следующих простых и коротких команд вы можете проверить свою удаленную ветку.

Сначала клонируйте свой репозиторий, затем перейдите в папку назначения. И последнее, но не менее важное: получение и оформление заказа:

git clone <repo> <destination_folder>
cd <destination_folder>
git fetch && git checkout <branch>

Вот и все. Вот немного более реальный пример:

git clone https://[email protected]/team/repository.git project_folder
cd project_folder
git fetch && git checkout develop

Подробную информацию о командах вы найдете в документации: Clone Команда, Команда получения, Команда оформления заказа

person Phil    schedule 11.03.2016

Этот вариант будет клонировать удаленное репо со всеми ветвями, доступными локально, без необходимости проверять каждую ветвь одну за другой. Никаких необычных скриптов не требуется.

Создайте папку с тем же именем репо, которое вы хотите клонировать, и cd, например:

mkdir somerepo
cd somerepo

Теперь выполните эти команды, но с фактическим именем пользователя / репо репо.

git clone --bare [email protected]:someuser/somerepo.git .git
git config --bool core.bare false
git reset --hard
git branch

Войала! у вас там все ветки!

person lacostenycoder    schedule 08.12.2018
comment
Этот метод сработал для меня. Просто и быстро. - person Kevin Ghadyani; 14.06.2019
comment
git rev-parse --abbrev-ref --symbolic-full-name '@{u}' показывает fatal: no upstream configured for branch 'master'. Должно быть origin/master. - person konsolebox; 20.06.2019

Немного поздно на вечеринку, но я думаю, что это помогает:

mkdir YourRepo
cd YourRepo
git init --bare .git                       # create a bare repo
git remote add origin REMOTE_URL           # add a remote
git fetch origin refs/heads/*:refs/heads/* # fetch heads
git fetch origin refs/tags/*:refs/tags/*   # fetch tags
git init                                   # reinit work tree
git checkout master                        # checkout a branch

Если это приведет к чему-то нежелательному, я хотел бы знать. Однако пока у меня это работает.

person Andy    schedule 12.09.2012
comment
Согласно примечанию № 2 в разделе refspec git fetch (kernel.org/pub/software/scm/git/docs/git-fetch.html), это, вероятно, необходимо отрегулировать. - person Andy; 12.09.2012
comment
Вы имеете в виду начало заметки, вы никогда не выполняете свою собственную разработку на ветках, которые появляются справа от двоеточия ‹refspec›? И, с поправкой, по какой причине? - person MarkDBlackwell; 18.07.2013
comment
@MarkDBlackwell, не совсем понимаю, о чем я тогда ... если честно. - person Andy; 22.07.2013

Я собираюсь добавить сюда свои 2 цента, потому что я пришел сюда, чтобы узнать, как вытащить удаленную ветку, которую я удалил локально. Origin не был моим, и я не хотел тратить время на повторное клонирование всего

Это сработало для меня:

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

git checkout -b recreated-branch-name
git branch -a (to list remote branches)
git rebase remotes/remote-origin/recreated-branch-name

Итак, если я разветвлю от gituser / master до sjp, а затем разветвлю его до sjp / mynewbranch, это будет выглядеть так:

$ git checkout -b mynewbranch
$ git branch -a
  master
  remotes/sjp/master
  remotes/sjp/mynewbranch
$ git fetch (habit to always do before)
$ git rebase remotes/sjp/mynewbranch
person Camwyn    schedule 14.07.2013

Это решение помогло мне скопировать репозиторий в другой:

git merge path/to/source.git --mirror
cd source.git
git remote remove origin
git remote add origin path/to/target.git
git push origin --all
git push origin --tags

В целевом репозитории я вижу те же ветки и теги, что и исходное репозиторий.

person Astor    schedule 28.07.2020

Здесь я написал вам красивую функцию, чтобы ее можно было легко повторить.

gitCloneAllBranches() { # clone all git branches at once easily and cd in
  # clone as "bare repo"
  git clone --mirror $1
  # rename without .git extension
  with_extension=$(basename $1)
  without_extension=$(echo $with_extension | sed 's/.git//')
  mv $with_extension $without_extension
  cd $without_extension
  # change from "bare repository" to not
  git config --bool core.bare false
  # check if still bare repository if so
  if [[ $(git rev-parse --is-bare-repository) == false ]]; then
    echo "ready to go"
  else
    echo "WARNING: STILL BARE GIT REPOSITORY"
  fi
  # EXAMPLES:
  # gitCloneAllBranches https://github.com/something/something.git
}
person jasonleonhard    schedule 23.07.2020

Это то, что я делаю всякий раз, когда мне нужно обрушить все ветки. Благодарности Рэю Вильялобосу от Linkedin Learning. Попробуйте клонировать все ветки, включая коммиты:

mkdir -p -- newproject_folder
cd newproject_folder
git clone --mirror https://github.com/USER_NAME/RepositoryName.git .git
git config --bool core.bare false
git reset --hard
person STREET MONEY    schedule 19.09.2020
comment
Несколько месяцев спустя, как обновить это зеркало со всеми последними изменениями? - person Devin Rhode; 26.06.2021
comment
Похоже, git remote update, очевидно, даст вам новое зеркало, если я правильно понимаю. Я думаю, это также может отражать очистку удаленного репо. Поэтому, если ссылки / ветки / теги / и т. Д. Были удалены удаленно, он удалит их локально. Но я не уверен на 100%. - person Devin Rhode; 26.06.2021

Лучшим альтернативным решением для разработчиков, использующих vscode, является использование Git Shadow Extension. . Это расширение vscode позволяет клонировать содержимое репозитория и каталоги, которые можно фильтровать по имени ветки или хешу фиксации. Таким образом, ветки или коммиты можно использовать в качестве шаблонов / шаблонов для новых проектов.

person ioedeveloper    schedule 22.01.2020

Вот кроссплатформенная функция PowerShell 7, адаптированная из предыдущих ответов.

function Invoke-GitCloneAll($url) {
    $repo = $url.Split('/')[-1].Replace('.git', '')
    $repo_d = Join-Path $pwd $repo
    if (Test-Path $repo_d) {
        Write-Error "fatal: destination path '$repo_d' already exists and is not an empty directory." -ErrorAction Continue
    } else {
        Write-Host "`nCloning all branches of $repo..."
        git -c fetch.prune=false clone $url -q --progress &&
        git -c fetch.prune=false --git-dir="$(Join-Path $repo_d '.git')" --work-tree="$repo_d" pull --all
        Write-Host "" #newline
    }
}

Примечание. -c fetch.prune=false включает устаревшие ветки, которые обычно исключаются, удалите их, если это вас не интересует.


Вы можете заставить эту работу работать с PowerShell 5.1 (по умолчанию в Windows 10), удалив && из функции, но при этом она будет пытаться git pull, даже если предыдущая команда не удалась. Итак, я настоятельно рекомендую просто использовать кроссплатформенную оболочку PowerShell, которая вас всегда беспокоит.

person Vopel    schedule 19.07.2020

Сделайте голый клон удаленного репозитория, сохраните содержимое в каталог .git

git clone --bare remote-repo-url.git localdirname/.git

(Чистый репозиторий git, созданный с помощью git clone --bare или git init --bare, является репозиторием хранилища, у него нет рабочего каталога, вы не можете создавать или изменять там файлы.)

Измените каталог на свой локальный каталог

cd localdirname

Сделайте ваш репозиторий git изменяемым

git config --bool core.bare false

Восстановите ваш рабочий каталог

git reset --hard

Перечислите все свои филиалы

git branch -al
person Victor Mwenda    schedule 13.07.2021

всеФилиалы

Скрипт для загрузки всех веток из проекта Git

Установка:

sudo git clone https://github.com/marceloviana/allBranches.git && sudo cp -rfv allBranches/allBranches.sh /usr/bin/allBranches && sudo chmod +x /usr/bin/allBranches && sudo rm -rf allBranches

Готовый! Теперь просто вызовите команду (allBranches) и сообщите каталогу проекта Git, что вы хотите загрузить все ветки.

Использование

Пример 1:

~$ allBranches /var/www/myproject1/

Пример 2:

~$ allBranches /var/www/myproject2/

Пример 3 (если он уже находится в каталоге проекта):

~$ allBranches ./

or

~$ allBranches .

Посмотреть результат:

git branch

Ссылка:

Репозиторий allBranches GitHub: https://github.com/marceloviana/allBranches

person Marcelo Viana    schedule 03.10.2019
comment
Кроме того, вам необходимо раскрыть свою принадлежность по любым предоставленным ссылкам. - person LittleBobbyTables - Au Revoir; 03.10.2019

Если вы используете BitBucket,

вы можете использовать import Repository, это импортирует всю историю git (все ветки и коммиты)

person M. Dhaouadi    schedule 18.08.2018