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

git github git-branch git-clone

1101390 просмотра

30 ответа

24567 Репутация автора

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

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

Автор: Peter Coulton Источник Размещён: 15.09.2008 10:42

Ответы (30)


20 плюса

2034 Репутация автора

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.

Автор: MattoxBeckman Размещён: 15.09.2008 10:46

57 плюса

14784 Репутация автора

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

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

git checkout -b branch origin/branchname
Автор: elmarco Размещён: 15.09.2008 10:47

79 плюса

830 Репутация автора

Выборка, которую вы делаете, должна получить все удаленные ветви, но она не создаст для них локальные ветви. Если вы используете 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:52

4297 плюса

49925 Репутация автора

Решение

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

19 плюса

26753 Репутация автора

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

92 плюса

1103 Репутация автора

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

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

с помощью

$ git checkout -t origin/experimental

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

$ git checkout --track origin/experimental

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

Автор: murphytalk Размещён: 27.07.2009 06:10

8 плюса

871 Репутация автора

Мне нужно было сделать то же самое. Вот мой скрипт на 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

775 плюса

12016 Репутация автора

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

$ git pull --all

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

Автор: Gabe Kopley Размещён: 13.01.2011 04:42

395 плюса

4005 Репутация автора

Этот скрипт 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

Автор: bigfish Размещён: 21.01.2011 02:18

38 плюса

405 Репутация автора

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

$ 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:40

317 плюса

3187 Репутация автора

Использование этой --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:49

211 плюса

38451 Репутация автора

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

44 плюса

651 Репутация автора

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

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

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

Автор: Jacob Fike Размещён: 26.11.2012 11:42

50 плюса

509 Репутация автора

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

10 плюса

411 Репутация автора

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


Это будет:

  1. проверьте мастер (чтобы мы могли удалить ветку, в которой мы находимся)
  2. выберите пульт, чтобы оформить заказ (измените его на тот, который у вас есть)
  3. цикл через все ветви пульта, кроме главного и HEAD
    1. удалить локальную ветку (чтобы мы могли проверить принудительно обновленные ветки)
    2. проверить ветку с пульта
  4. проверить мастер (ради этого)

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

Автор: ikaruss Размещён: 20.12.2013 06:38

44 плюса

1108 Репутация автора

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

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:19

45 плюса

1218 Репутация автора

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

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видеть локальные ветви).

Автор: Cerran Размещён: 05.03.2014 01:47

23 плюса

9213 Репутация автора

Вам нужно всего лишь использовать "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:43

6 плюса

4109 Репутация автора

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

12 плюса

1698 Репутация автора

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:33

5 плюса

2803 Репутация автора

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

(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

16 плюса

848 Репутация автора

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:

  1. 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.

  1. 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
  1. 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:08

6 плюса

126 Репутация автора

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

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

7 плюса

75848 Репутация автора

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 is origin.
    • Check if origin points to the right URL via: git remote show origin (see this post).
Автор: kenorb Размещён: 31.03.2016 12:48

8 плюса

622 Репутация автора

Я написал эту небольшую функцию 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:54

12 плюса

2484 Репутация автора

#!/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:20

12 плюса

5390 Репутация автора

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

6 плюса

6559 Репутация автора

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

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

Автор: ashes999 Размещён: 21.04.2017 08:14

13 плюса

57191 Репутация автора

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:

git branch - все ветки получить

Автор: Alireza Размещён: 22.07.2017 06:29

5 плюса

116 Репутация автора

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
Вопросы из категории :
32x32