Как клонировать все удаленные ветки в Git?
У меня есть master
и development
ветка, обе подтолкнули к GitHub. Я clone
д, pull
и fetch
Эд, но я по-прежнему не могу получить ничего, кроме master
ответвление назад.
Я уверен, что упускаю что-то очевидное, но я прочитал руководство и совсем не радуюсь.
49 ответов
Сначала клонируйте удаленный репозиторий Git и перейдите в него:
$ 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
Если вы просто хотите быстро взглянуть на ветку upstream, вы можете проверить это непосредственно:
$ 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 &
Если у вас есть много удаленных веток, которые вы хотите получить сразу, выполните:
$ git pull --all
Теперь вы можете оформить любую ветку, как вам нужно, не обращаясь к удаленному хранилищу.
Этот скрипт Bash помог мне:
#!/bin/bash
for branch in $(git branch --all | grep '^\s*remotes' | egrep --invert-match '(:?HEAD|master)$'); do
git branch --track "${branch##*/}" "$branch"
done
Он создаст ветви отслеживания для всех удаленных ветвей, кроме главной (которую вы, вероятно, получили из оригинальной команды клонирования). Я думаю, что вам все еще нужно сделать
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
С использованием --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: Как мне клонировать репозиторий со всеми удаленно отслеживаемыми ветками?
Вы можете легко переключиться на ветку, не используя причудливый синтаксис "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:
Если
не найден, но существует отслеживающая ветвь только на одном удаленном (назовите его ) с соответствующим именем, обрабатывайте как эквивалент $ git checkout -b <branch> --track <remote>/<branch>
Что касается,
$ git checkout -b экспериментальное происхождение / экспериментальное
с помощью
$ git checkout -t origin/experimental
или более многословный, но легче запомнить
$ git checkout --track origin/experimental
может быть лучше, с точки зрения отслеживания удаленного хранилища.
Используйте псевдонимы. Хотя в 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
Выборка, которую вы делаете, должна получить все удаленные ветви, но она не создаст для них локальные ветви. Если вы используете gitk, вы должны увидеть удаленные ветви, описанные как "remotes / origin / dev" или что-то подобное.
Чтобы создать локальную ветвь на основе удаленной ветки, сделайте что-то вроде:
git checkout -b dev refs / remotes / origin / dev
Который должен вернуть что-то вроде:
Ветвь dev настроена на отслеживание удаленных веток refs / remotes / origin / dev. Перешел на новую ветку "dev"
Теперь, когда вы находитесь в ветке dev, "git pull" обновит ваш локальный dev до той же точки, что и удаленная ветка dev. Обратите внимание, что он будет извлекать все ветви, но только тянуть ту, на которой вы находитесь, к вершине дерева.
Лучше поздно, чем никогда, но вот лучший способ сделать это:
mkdir repo
cd repo
git clone --bare path/to/repo.git .git
git config --unset core.bare
git reset --hard
На данный момент у вас есть полная копия удаленного репо со всеми его ветками (проверьте с помощью git branch
). Ты можешь использовать --mirror
вместо --bare
если у вашего удаленного репо есть свои пульты.
Когда вы делаете "git clone git://location", все ветки и теги выбираются.
Чтобы работать поверх определенной удаленной ветви, предполагая, что это удаленный источник:
git checkout -b branch origin/branchname
Почему вы видите только "мастер"
git clone
загружает все удаленные удаленные ветви, но все равно считает их "удаленными", даже если файлы находятся в вашем новом хранилище. Есть одно исключение, которое заключается в том, что процесс клонирования создает локальную ветвь с именем "master" из удаленной ветки с именем "master". По умолчанию, git branch
показывает только локальные филиалы, поэтому вы видите только "мастер".
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
увидеть местные филиалы).
Это не слишком сложно, очень простые и понятные шаги заключаются в следующем;
git fetch origin
Это приведет все удаленные филиалы к вашему локальному.
git branch -a
Это покажет вам все удаленные ветви.
git checkout --track origin/<branch you want to checkout>
Проверьте, находитесь ли вы в нужной ветке, с помощью следующей команды;
git branch
Вывод понравится;
*your current branch
some branch2
some branch3
Обратите внимание на знак *, который обозначает текущую ветвь.
Просто сделай это:
$ 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' извлекает все, даже ветви, вам просто нужно их оформить, тогда будет создана ваша локальная ветка.
Вам нужно всего лишь использовать "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 " могут быть успешно запущены при закрытии вашего wifi. Итак, доказано, что когда вы делаете "git clone", он уже скопировал все ветви из удаленного репо. После этого вам не нужно удаленное репо, ваш локальный уже имеет коды всех филиалов.
git clone
Предполагается скопировать весь репозиторий. Попробуйте клонировать его, а затем запустите git branch -a
, Следует перечислить все ветви. Если вы хотите переключиться на ветку "foo" вместо "master", используйте git checkout foo
,
Все ответы, которые я видел здесь, верны, но есть гораздо более чистый способ клонировать репозиторий и вытащить все ветви одновременно.
Когда вы клонируете репозиторий, вся информация о ветвях фактически загружается, но ветви скрыты. С помощью команды
$ git branch -a
Вы можете показать все ветви хранилища, и с помощью команды
$ git checkout -b branchname origin/branchname
затем вы можете "загрузить" их вручную по одному.
Однако, когда вы хотите клонировать репо с большим количеством веток, все вышеприведенные способы являются длительными и утомительными по сравнению с гораздо более понятным и быстрым способом, который я собираюсь показать, хотя это немного сложно. Вам нужно три шага, чтобы сделать это:
- Первый шаг
создайте новую пустую папку на своем компьютере и клонируйте зеркальную копию папки.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" из терминала.
- Второй шаг
переключите этот репозиторий из пустого (пустого) репозитория в обычный репозиторий, переключив логическое значение "bare" конфигурации git на false:
$ git config --bool core.bare false
- Третий шаг
Возьмите все, что находится внутри текущей папки, и создайте все ветви на локальном компьютере, поэтому сделайте это обычным репо.
$ git reset --hard
Теперь вы можете просто набрать команду "git branch" и увидеть, что все ветви загружены.
Это быстрый способ, которым вы можете клонировать git-репозиторий со всеми ветками одновременно, но это не то, что вы хотите сделать для каждого отдельного проекта таким образом.
Принятый ответ git branch -a
показывает только удаленные ветки. Если вы попытаетесьcheckout
филиалы, которые вы не сможете использовать, если у вас все еще нет сетевого доступа к исходному серверу.
Если вы ищете автономный клон или резервную копию, включающую все удаленные ветки и журналы фиксации, используйте:
git clone http://user@repo.url
git pull --all
Предоставлено: Гейб Копли за предложение использоватьgit pull --all
.
Примечание.
Конечно, если у вас больше нет сетевого доступа кremote/origin
сервер remote/origin branches
в них не будут отражены какие-либо обновления. Их изменения будут отражать коммиты с даты и времени, когда вы выполнили 2 команды выше.
Извлеките * локальную * ветку обычным способом с помощью `git checkout remote / origin /` Используйте `git branch -a`, чтобы открыть удаленные ветки, сохраненные в вашем репозитории` clone`.
Чтобы проверить ВСЕ ваши клонированные ветки в локальные ветки с помощью одной команды, используйте одну из команд 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
ИЛИ
Если в вашем репо есть вложенные ветки, эта команда учтет это:
for i in $(git branch -a |grep 'remotes' |grep -v 'HEAD ->');do \
basename ${i##\./} | xargs -I {} git checkout -b {} --track origin/{}; done
Вышеупомянутые команды будут `проверять` локальную ветвь в вашем локальном репозитории git, названную так же, как *`remote / origin / `*, и установят для нее значение`--track`, изменения из удаленной ветки на *`remote/origin`* server, если вы снова восстановите сетевой доступ к исходному серверу репозитория и выполните команду` git pull` обычным способом.
Используйте мой инструмент git_remote_branch (на вашем компьютере должен быть установлен Ruby). Он создан специально для упрощения работы с удаленными ветвями.
Каждый раз, когда он выполняет операцию от вашего имени, он печатает его красным на консоли. Со временем они наконец втыкаются в ваш мозг:-)
Если вы не хотите, чтобы grb запускал команды от вашего имени, просто используйте функцию объяснения. Команды будут напечатаны на вашей консоли, а не выполнены для вас.
Наконец, все команды имеют псевдонимы для упрощения запоминания.
Обратите внимание, что это альфа-программа;-)
Вот справка, когда вы запускаете grb help:
git_remote_branch версия 0.2.6 Использование: grb создать имя_в ветви [origin_server] grb опубликовать имя_в_ [origin_server] grb переименовать имя_в_ [origin_server] grb удалить имя_в_ [origin_server] grb track имя_в_ [origin_server] Примечания: - Если origin_server не указан, имя 'origin'предполагается (по умолчанию в git) - функция переименования переименовывает текущую ветвь. Мета-команда объяснения: вы также можете добавить любую команду с ключевым словом "объяснить". Вместо выполнения команды git_remote_branch просто выведет список команд, которые вам нужно выполнить для достижения этой цели. Пример: grb объяснение create grb объяснение create my_branch github У всех команд также есть псевдонимы: create: create, new delete: удалить, уничтожить, убить, удалить, rm publish: опубликовать, remotize переименовать: переименовать, rn, mv, переместить трек: дорожка, следуй, хватай, выбирай
#!/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
Этот код будет тянуть все удаленные ветки код для локального репо.
Клонирование из локального репозитория не будет работать с 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
Глядя на один из ответов на вопрос, я заметил, что его можно сократить:
for branch in `git branch -r | grep -v 'HEAD\|master'`; do
git branch --track ${branch##*/} $branch;
done
Но будьте осторожны, если одна из удаленных веток называется, например, admin_master, она не будет загружена!
Спасибо Bigfish за оригинальную идею
Хорошо, когда вы клонируете свой репо, у вас есть все филиалы там...
Если вы просто делаете git branch
они вроде как спрятаны...
Так что если вы хотите увидеть название всех веток, просто добавьте --all
пометить так:
git branch --all
или же git branch -a
Если вы просто оформите заказ в филиале, вы получите все, что вам нужно.
Но как быть, если ветка, созданная кем-то другим после вас, клонируется?
В этом случае просто сделайте:
git fetch
и проверьте все ветви снова...
Если вы хотите получить и оформить заказ одновременно, вы можете сделать:
git fetch && git checkout your_branch_name
Также создал изображение ниже для вас, чтобы упростить то, что я сказал:
Резюме того, что я успешно сделал всего месяц назад:
mkdir -p -- myapp-mirror
cd myapp-mirror
git clone --mirror https://git.myco.com/mygroup/myapp.git .git
git config --bool core.bare false
git config --bool core.logAllRefUpdates true
git reset --hard
На основании нескольких ответов.
git clone --mirror
на оригинальном репо хорошо для этого работает.
git clone --mirror /path/to/original.git
git remote set-url origin /path/to/new-repo.git
git push -u origin
Сейчас сентябрь 2021 года, и это все еще проблема, по крайней мере, для меня. Я просмотрел все ответы и нашел довольно много моих ТАКИХ удручающих сокровищ, в первую очередь всегда популярное: «Зачем вам это нужно?» и его более педантичный младший брат: «Это не то, что вам нужно». Я почти могу прочесть "детское" завершение этого предложения.
Говоря о педантичности, ПОЖАЛУЙСТА, сравните свое «это» со своим, хорошо? Это стыдно.
Я клонирую репо из курса Udemy ( Elegant Automation Frameworks с Python и Pytestкстати, отличный курс), чтобы позже я мог просмотреть его в автономном режиме. Я попытался загрузить zip-архив, но он подходит только для текущей ветки, так что вот мои 2 цента.
Я работаю над Windows и, очевидно, прибег к оболочке Ubuntu из WSL. сразу после клонирования вот мои ветки:
$ git clone https://github.com/BrandonBlair/elegantframeworks.git
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/config_recipe
remotes/origin/functionaltests
remotes/origin/master
remotes/origin/parallel
remotes/origin/parametrize
remotes/origin/parametrize_data_excel
remotes/origin/unittesting
remotes/origin/unittesting1
Затем - и после удара по нескольким кирпичным стенам - у меня наконец сработало:
$ for b in `git branch -a | cut -c18- | cut -d\ -f1`; do git checkout $b; git stash; done
После этого вот мои ветки:
$ git branch -a
config_recipe
functionaltests
master
parallel
parametrize
parametrize_data_excel
unittesting
* unittesting1
remotes/origin/HEAD -> origin/master
remotes/origin/config_recipe
remotes/origin/functionaltests
remotes/origin/master
remotes/origin/parallel
remotes/origin/parametrize
remotes/origin/parametrize_data_excel
remotes/origin/unittesting
remotes/origin/unittesting1
С уважением ко всем навороченным решениям, в том числе
Perl
(видел ли я
awk
или
sed
там?), мой идет физический, вырезая начальный
remotes/origin/
а затем фильтрация разделителей пробелов. Возможно, я мог бы просто
grep
выброшен
HEAD
и покончить с одним
cut
, но я оставлю это для комментариев.
Обратите внимание, что ваша текущая ветка теперь последняя в списке. Если вы не знаете, почему это так, значит, вы попали в затруднительное положение. Просто
git checkout
все, что вы хотите сейчас.
я не
git
гуру. Я уверен, что будет еще один способ сделать это с помощью gitonic (патент заявлен !), Но мне все равно. Когда дело доходит до дела, командная строка UNIX была моим Господом и Спасителем с 1989 года. Могу ли я получить аминь за
*nix
?
Я написал эту небольшую функцию 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 settings
Вот ответ, в котором используется awk. Этого метода должно хватить при использовании в новом репо.
git branch -r | awk -F/ '{ system("git checkout " $NF) }'
Существующие ветки будут просто извлечены или объявлены как уже присутствующие, но можно добавить фильтры, чтобы избежать конфликтов.
Его также можно изменить, чтобы вызвать явный git checkout -b <branch> -t <remote>/<branch>
команда.
Этот ответ следует Nikos C.. "s идея.
В качестве альтернативы мы можем указать удаленную ветку. Это основано на murphytalk"s ответ.
git branch -r | awk '{ system("git checkout -t " $NF) }'
Он выдает сообщения о фатальных ошибках при конфликтах, но я считаю их безвредными.
Обе команды могут иметь псевдонимы.
Использование nobody"сек ответа в качестве ссылки, мы можем иметь следующие команды для создания псевдонимов:
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
.
Ни один из этих ответов не урезал его, кроме того, что никто не находится на правильном пути.
У меня были проблемы с перемещением репо с одного сервера / системы на другой. Когда я клонировал репозиторий, он только создавал локальную ветвь для мастера, поэтому, когда я отправлялся на новый удаленный сервер, была перемещена только основная ветка.
Поэтому я нашел эти два метода очень полезными. Надеюсь, они помогут кому-то еще.
Способ 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
Используйте команды, которые вы можете запомнить
Я использую Bitbucket, Хостинговую Службу Репозитория Atlassian. Поэтому я стараюсь следовать их документам. И это прекрасно работает для меня. С помощью следующих простых и коротких команд вы можете оформить удаленную ветку.
Сначала клонируйте свой репозиторий, затем перейдите в папку назначения. И последнее, но не менее важное: выборка и проверка:
git clone <repo> <destination_folder>
cd <destination_folder>
git fetch && git checkout <branch>
Вот и все. Вот немного более реальный пример:
git clone https://username@bitbucket.org/team/repository.git project_folder
cd project_folder
git fetch && git checkout develop
Подробную информацию о командах вы найдете в документации: Команда клонирования, Команда извлечения, Команда извлечения
Для копирования-вставки в командную строку:
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
Это будет:
- проверить мастер (чтобы мы могли удалить ветку, в которой мы находимся)
- выберите пульт, чтобы оформить заказ (замените его на тот, который у вас есть)
- цикл через все ветви пульта, кроме главного и HEAD
- удалить локальную ветку (чтобы мы могли проверить принудительно обновленные ветки)
- проверить ветку с пульта
- проверить мастер (ради этого)