Как клонировать все удаленные ветки в Git?
1101390 просмотра
30 ответа
У меня есть master
и development
ветка, оба подтолкнули на GitHub . У меня есть clone
d, pull
ed и fetch
ed, но я не могу получить ничего, кроме master
ответвления.
Я уверен, что упускаю что-то очевидное, но я прочитал руководство и совсем не радуюсь.
Автор: Peter Coulton Источник Размещён: 20.06.2019 05:06Ответы (30)
4297 плюса
Сначала клонируйте удаленный репозиторий 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'
Эта последняя строка бросает некоторых людей: «Новая ветка» - а? На самом деле это означает, что ветка берется из индекса и создается для вас локально. Предыдущая линия на самом деле более информативная, он говорит вам , что филиал создается для отслеживания удаленного филиала, что обычно означает происхождение / 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 &
Автор: emk
Размещён: 16.09.2008 01:28
775 плюса
Если у вас есть много удаленных веток, которые вы хотите получить сразу, выполните:
$ git pull --all
Теперь вы можете оформить любую ветку, как вам нужно, не обращаясь к удаленному хранилищу.
Автор: Gabe Kopley Размещён: 13.01.2011 04:42395 плюса
Этот скрипт 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
чтобы быть уверенным.
Автор: bigfish Размещён: 21.01.2011 02:18Один лайнер :
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
317 плюса
Использование этой --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: Как мне клонировать репозиторий со всеми удаленно отслеживаемыми ветками?
Автор: Dave Размещён: 27.08.2011 05:49211 плюса
Вы можете легко переключиться на ветку, не используя причудливый синтаксис "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:
Автор: Nikos C. Размещён: 12.05.2012 12:11Если
не найден, но существует отслеживающая ветвь ровно в одном удаленном (называемом ) с соответствующим именем, обрабатывать как эквивалент $ git checkout -b <branch> --track <remote>/<branch>
92 плюса
Что касается,
$ git checkout -b экспериментальное происхождение / экспериментальное
с помощью
$ git checkout -t origin/experimental
или более многословный, но легче запомнить
$ git checkout --track origin/experimental
может быть лучше, с точки зрения отслеживания удаленного хранилища.
Автор: murphytalk Размещён: 27.07.2009 06:1079 плюса
Выборка, которую вы делаете, должна получить все удаленные ветви, но она не создаст для них локальные ветви. Если вы используете gitk, вы должны увидеть удаленные ветви, описанные как «remotes / origin / dev» или что-то подобное.
Чтобы создать локальную ветку на основе удаленной ветки, сделайте что-то вроде:
git checkout -b dev refs / remotes / origin / dev
Который должен вернуть что-то вроде:
Ветвь dev настроена для отслеживания удаленных веток refs / remotes / origin / dev. Перешел на новую ветку "dev"
Теперь, когда вы находитесь в ветке dev, "git pull" обновит ваш локальный dev до той же точки, что и удаленная ветка dev. Обратите внимание, что он будет извлекать все ветви, но только тянуть ту, на которой вы находитесь, к вершине дерева.
Автор: Luuk Paulussen Размещён: 15.09.2008 10:5257 плюса
Когда вы делаете «git clone git: // location», все ветки и теги выбираются.
Чтобы работать поверх определенной удаленной ветви, предполагая, что это удаленный источник:
git checkout -b branch origin/branchname
Автор: elmarco
Размещён: 15.09.2008 10:47
50 плюса
Используйте псевдонимы. Хотя в 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
Автор: nobody
Размещён: 15.05.2013 11:02
45 плюса
Почему вы видите только «мастер»
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
видеть локальные ветви).
44 плюса
Это не слишком сложно, очень простые и понятные шаги заключаются в следующем;
git fetch origin
Это приведет все удаленные филиалы к вашему локальному.
git branch -a
Это покажет вам все удаленные ветви.
git checkout --track origin/<branch you want to checkout>
Проверьте, находитесь ли вы в нужной ветке, с помощью следующей команды;
git branch
Вывод понравится;
*your current branch
some branch2
some branch3
Обратите внимание на знак *, который обозначает текущую ветвь.
Автор: Sam Размещён: 26.12.2013 10:1944 плюса
Лучше поздно, чем никогда, но вот лучший способ сделать это:
mkdir repo
cd repo
git clone --bare path/to/repo.git .git
git config --unset core.bare
git reset --hard
На данный момент у вас есть полная копия удаленного репо со всеми его ветками (проверьте с помощью git branch
). Вы можете использовать --mirror
вместо, --bare
если ваше удаленное хранилище имеет свои собственные пульты.
38 плюса
Просто сделай это:
$ 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' выбирает все, даже ветви, вам просто нужно их оформить, тогда будет создана ваша локальная ветка.
Автор: rapher Размещён: 31.05.2011 11:4023 плюса
Вам нужно всего лишь использовать "git clone", чтобы получить все ветки.
git clone <your_http_url>
Даже если вы видите только ветку master, вы можете использовать «git branch -a», чтобы увидеть все ветви.
git branch -a
И вы можете переключиться на любую ветку, которая у вас уже есть.
git checkout <your_branch_name>
Don't worry that after you "git clone", you don't need to connect with the remote repo, "git branch -a" and "git checkout " can be run successfully when you close your wifi. So it is proved that when you do "git clone", it already has copied all branches from the remote repo. After that, you don't need the remote repo, your local already has all branches' codes.
Автор: Haimei Размещён: 19.11.2014 03:4320 плюса
A git clone
is supposed to copy the entire repository. Try cloning it, and then run git branch -a
. It should list all the branches. If then you want to switch to branch "foo" instead of "master", use git checkout foo
.
19 плюса
Use my tool git_remote_branch (you need Ruby installed on your machine). It's built specifically to make remote branch manipulations dead easy.
Each time it does an operation on your behalf, it prints it in red at the console. Over time, they finally stick into your brain :-)
If you don't want grb to run commands on your behalf, just use the 'explain' feature. The commands will be printed to your console instead of executed for you.
Finally, all commands have aliases, to make memorization easier.
Note that this is alpha software ;-)
Here's the help when you run 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Автор: webmat Размещён: 20.09.2008 01:53
16 плюса
all the answers I saw here are valid but there is a much cleaner way to clone a repository and to pull all the branches at once.
When you clone a repository all the information of the branches is actually downloaded but the branches are hidden. With the command
$ git branch -a
you can show all the branches of the repository, and with the command
$ git checkout -b branchname origin/branchname
you can then "download" them manually one at a time.
However, when you want to clone a repo with a lot of branches all the ways illustrated are above are lengthy and tedious in respect to a much cleaner and quicker way that I am going to show, though it's a bit complicated. You need three steps to accomplish this:
- First step
create a new empty folder on your machine and clone a mirror copy of the .git folder from the repository:
$ cd ~/Desktop && mkdir my_repo_folder && cd my_repo_folder
$ git clone --mirror https://github.com/planetoftheweb/responsivebootstrap.git .git
the local repository inside the folder my_repo_folder is still empty, there is just a hidden .git folder now that you can see with a "ls -alt" command from the terminal.
- Second step
switch this repository from an empty (bare) repository to a regular repository by switching the boolean value "bare" of the git configurations to false:
$ git config --bool core.bare false
- Third Step
Grab everything that inside the current folder and create all the branches on the local machine, therefore making this a normal repo.
$ git reset --hard
So now you can just type the command "git branch" and you can see that all the branches are downloaded.
This is the quick way in which you can clone a git repository with all the branches at once, but it's not something you wanna do for every single project in this way.
Автор: FedericoCapaldo Размещён: 06.12.2015 08:0813 плюса
OK, when you clone your repo, you have all branches there...
If you just do git branch
, they are kind of hidden...
So if you'd like to see all branches name, just simply add --all
flag like this:
git branch --all
or git branch -a
If you just checkout to the branch, you get all you need.
But how about if the branch created by someone else after you clone?
In this case, just do:
git fetch
and check all branches again...
If you like to fetch and checkout at the same time, you can do:
git fetch && git checkout your_branch_name
Also created the image below for you to simplify what I said:
Автор: Alireza Размещён: 22.07.2017 06:2912 плюса
Looking at one of answers to the question I noticed that it's possible to shorten it:
for branch in `git branch -r | grep -v 'HEAD\|master'`; do
git branch --track ${branch##*/} $branch;
done
But beware, if one of remote branches is named as e.g. admin_master it won't get downloaded!
Thanks to bigfish for original idea
Автор: Tebe Размещён: 19.02.2015 09:3312 плюса
#!/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
These code will pull all remote branches code to local repo.
Автор: Albert.Qing Размещён: 11.12.2016 02:2012 плюса
Cloning from a local repo will not work with git clone & git fetch: a lot of branches/tags will remain unfetched.
To get a clone with all branches and tags.
git clone --mirror git://example.com/myproject myproject-local-bare-repo.git
To get a clone with all branches and tags but also with a working copy:
git clone --mirror git://example.com/myproject myproject/.git
cd myproject
git config --unset core.bare
git config receive.denyCurrentBranch updateInstead
git checkout master
Автор: raisercostin
Размещён: 23.02.2017 11:55
10 плюса
For copy-paste into command line:
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
- удалить локальную ветку (чтобы мы могли проверить принудительно обновленные ветки)
- проверить ветку с пульта
- проверить мастер (ради этого)
8 плюса
Мне нужно было сделать то же самое. Вот мой скрипт на 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]
Автор: user43685
Размещён: 10.12.2010 11:12
8 плюса
Я написал эту небольшую функцию 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
Автор: gringo_dave Размещён: 19.06.2016 10:547 плюса
Git обычно (если не указан) извлекает все ветви и / или теги (ссылки, см .:) git ls-refs
из одного или нескольких других хранилищ вместе с объектами, необходимыми для завершения их истории. Другими словами, он выбирает объекты, которые доступны объектам, которые уже загружены. Смотрите: что на git fetch
самом деле делает?
Иногда у вас могут быть ветки / теги, которые не связаны напрямую с текущим, поэтому git pull --all
/ git fetch --all
не помогут в этом случае, но вы можете перечислить их следующим образом:
git ls-remote -h -t origin
и получить их вручную, зная имена ссылок.
Итак, чтобы получить их все , попробуйте:
git fetch origin --depth=10000 $(git ls-remote -h -t origin)
--depth=10000
Параметр может помочь , если вы обмелевший репозиторий.
Затем проверьте все свои ветви снова:
git branch -avv
If above won't help, you need to add missing branches manually to the tracked list (as they got lost somehow):
$ git remote -v show origin
...
Remote branches:
master tracked
by git remote set-branches
like:
git remote set-branches --add origin missing_branch
so it may appear under remotes/origin
after fetch:
$ 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
Troubleshooting
If you still cannot get anything other than the master branch, check the followings:
- Double check your remotes (
git remote -v
), e.g.- Validate that
git config branch.master.remote
isorigin
. - Check if
origin
points to the right URL via:git remote show origin
(see this post).
- Validate that
6 плюса
None of these answers cut it, except user nobody is on the right track.
I was having trouble with moving a repo from one server/system to another. When I cloned the repo, it only created a local branch for master so when I pushed to the new remote, only master branch was pushed.
Таким образом, я нашел эти два метода очень полезными. Надеюсь, они помогут кому-то еще.
Способ 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
Автор: Gaui
Размещён: 23.01.2015 05:51
6 плюса
Используйте команды, которые вы можете запомнить
Я использую 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
Вы найдете подробную информацию о командах в документы: Clone Командования , Fetch Command , заказ Command
Автор: Phil Размещён: 11.03.2016 08:016 плюса
По состоянию на начало 2017 года ответ в этом комментарии работает:
git fetch <origin-name> <branch-name>
приносит ветку для вас. Хотя это не вытягивает все ветви одновременно, вы можете выполнять эту ветку отдельно.
5 плюса
Вот еще одна короткая однострочная команда, которая создает локальные ветви для всех удаленных ветвей:
(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
Автор: jofel
Размещён: 10.09.2015 12:04
5 плюса
git clone --mirror
на оригинальном репо хорошо для этого работает.
git clone --mirror /path/to/original.git
git remote set-url origin /path/to/new-repo.git
git push -u origin
Автор: Bernd Jungblut
Размещён: 25.05.2018 05:34
Вопросы из категории :
- git Как я могу отменить git reset --hard HEAD ~ 1?
- git Как настроить Git голый доступный по HTTP репозиторий на IIS
- git Как мне отменить неустановленные изменения в Git?
- git Как удалить локальные (неотслеживаемые) файлы из текущего рабочего дерева Git?
- git Как клонировать все удаленные ветки в Git?
- github Как я могу удалить коммит на GitHub?
- github Доступ к оболочке git в GitX в OS X
- github Как мне вытащить свой проект из github?
- github Обновление локального репозитория с изменениями из репозитория GitHub
- git-branch Сделать существующую ветку Git отслеживающей удаленную ветку?
- git-branch Показывает, какие файлы были изменены между двумя ревизиями
- git-branch Default behavior of "git push" without a branch specified
- git-clone Как мне клонировать только подкаталог Git-репозитория?
- git-clone Как вы клонируете репозиторий Git в определенную папку?
- git-clone Загрузите определенный тег с помощью Git
- git-clone Как клонировать одну ветвь в Git?