it-swarm-ru.tech

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

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

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

3746
Peter Coulton

Сначала клонируйте удаленный 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

Если вы просто хотите быстро взглянуть на ветку 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'

Эта последняя строка бросает некоторых людей: «Новая ветвь» - да? Что действительно означает, что ветка взята из индекса и создана для вас локально. Строка previous на самом деле более информативна, так как сообщает, что ветка настраивается для отслеживания удаленной ветки, что обычно означает ветку 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 &
4191
emk

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

$ git pull --all

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

763
Gabe Kopley

Этот 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

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

One liner: 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

388
bigfish

Использование параметра --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: Как мне клонировать репозиторий со всеми удаленно отслеживаемыми ветками?

300
Dave

Вы можете легко переключиться на ветку, не используя причудливый синтаксис "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>
208
Nikos C.

Что касается,

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

с помощью

$ git checkout -t Origin/experimental

или более многословный, но легче запомнить

$ git checkout --track Origin/experimental

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

90
murphytalk

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

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

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

Который должен вернуть что-то вроде:

Ветвь dev настроена для отслеживания удаленной ветки refs/remotes/Origin/dev .
 Переключена на новую ветку "dev"

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

78
Luuk Paulussen

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

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

git checkout -b branch Origin/branchname
57
elmarco

Используйте псевдонимы. Хотя в 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
49
nobody

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

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

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

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

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

git branch

Вывод понравится;

*your current branch 
some branch2
some branch3 

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

44
Sam

Почему вы видите только «мастер»

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 для просмотра локальных ветвей).

43
Cerran

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

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

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

42
Jacob Fike

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

$ 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' выбирает все, даже ветви, вам просто нужно их оформить, тогда будет создана ваша локальная ветка.

38
rapher

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

git clone <your_http_url>

Даже если вы видите только ветку master, вы можете использовать «git branch -a», чтобы увидеть все ветви.

git branch -a

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

git checkout <your_branch_name>

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

23
Haimei

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

22
MattoxBeckman

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

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

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

Наконец, все команды имеют псевдонимы для упрощения запоминания.

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

Вот справка, когда вы запускаете grb help:

 git_remote_branch версия 0.2.6 

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

 grb создать имя_сервера [Origin_server] 

 grb publish branch_name [Origin_server] 

 grb переименовать имя_сервера [Origin_server] 

 grb удалить имя_сервера [Origin_server] 

 GRB-трек имя_сервера [Origin_server] 



 Заметки:
 - Если Origin_server не указан, предполагается, что имя «Origin» 
 (Git по умолчанию) 
 - Функция переименования переименовывает текущую ветку 

 Мета-команда объяснения: вы также можете добавить любую команду к ключевому слову 
 Вместо выполнения команды git_remote_branch 
 Просто выведет список команд, которые вам нужно выполнить для достижения 
 Этой цели .

 Пример: 
 grb объяснить создать 
 grb объяснять создать my_branch github 

 Все команды также имеют псевдонимы: 
 создать: создать, новый 
 удалить: удалить, уничтожить, убить, удалить, .m 
 публиковать: публиковать, remotize 
 переименовать: переименовать, р-н, мв, двигаться 
 отслеживать: отслеживать, следовать, захватывать, получать 
19
webmat

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

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

$ 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-репозиторий со всеми ветками одновременно, но это не то, что вы хотите сделать для каждого отдельного проекта таким образом. 

15
FedericoCapaldo

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

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

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

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

12
Tebe

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

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

Так что, если вы хотите увидеть название всех ветвей, просто добавьте флаг --all так:

git branch --all или git branch -a

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

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

В этом случае просто сделайте:

git fetch

и проверьте все ветви снова ...

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

git fetch && git checkout your_branch_name

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

 git branch --all to get all branches

12
Alireza

Клонирование из локального репозитория не будет работать с 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
11
raisercostin
#!/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

Этот код перетянет все удаленные ветки в локальный репозиторий.

11
Albert.Qing

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

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. перебрать все ветви пульта дистанционного управления, кроме master и HEAD
    1. delete локальная ветвь (чтобы мы могли проверить принудительно обновленные ветки)
    2. проверить ветку с пульта
  4. проверить мастер (ради этого)

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

10
ikaruss

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

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

8
gringo_dave

Мне нужно было сделать то же самое. Вот мой 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]
8
user43685

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

Иногда у вас могут быть ветки/теги, которые не связаны напрямую с текущим, поэтому git pull --allgit fetch --all в этом случае не поможет, но вы можете перечислить их следующим образом:

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

Поиск проблемы

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

  • Дважды проверьте ваши пульты (git remote -v), например, .
    • Убедитесь, что git config branch.master.remote является Origin.
    • Проверьте, указывает ли Origin на правильный URL-адрес с помощью: git remote show Origin (см. Этот post ).
6
kenorb

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

git fetch <Origin-name> <branch-name> останавливает ветку для вас. Хотя это не вытягивает все ветви одновременно, вы можете выполнять эту ветвь по отдельности.

6
ashes999

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

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

Таким образом, я нашел эти два метода очень полезными. Надеюсь, они помогут кому-то еще.

Метод 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
6
Gaui

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

Я использую 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

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

6
Phil

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

(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
5
jofel

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

git clone --mirror /path/to/original.git
git remote set-url Origin /path/to/new-repo.git
git Push -u Origin
3
Bernd Jungblut

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

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

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

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
2
Camwyn

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

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

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

0
Andy

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

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

mkdir somerepo
cd somerepo

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

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

Voiala! у вас есть все филиалы там!

0
lacostenycoder

Вот скрипт bash для извлечения всех веток и тегов проекта git в виде снимков в отдельные папки. 

https://Gist.github.com/hfossli/7562257

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

0
hfossli