Как клонировать все удаленные ветки в Git? - PullRequest
3841 голосов
/ 16 сентября 2008

У меня есть ветвь master и development, оба сдвинуты до GitHub . У меня есть clone d, pull ed и fetch ed, но я не могу получить ничего, кроме master ответвления.

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

Ответы [ 35 ]

4285 голосов
/ 16 сентября 2008

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

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

Далее, посмотрите на локальные ветки в вашем хранилище:

$ git branch
* master

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

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

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

$ git checkout origin/experimental

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

$ git checkout experimental

и вы увидите

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

Эта последняя строка бросает некоторых людей: "Новая ветвь" - а? На самом деле это означает, что ветка берется из индекса и создается для вас локально. предыдущая строка на самом деле более информативна, поскольку сообщает, что ветка настраивается для отслеживания удаленной ветки, что обычно означает ветку origin / branch_name

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

$ git branch
* experimental
  master

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

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

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

$ gitk --all &
775 голосов
/ 13 января 2011

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

$ git pull --all

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

393 голосов
/ 21 января 2011

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

317 голосов
/ 27 августа 2011

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

210 голосов
/ 12 мая 2012

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

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

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

с помощью

$ git checkout -t origin/experimental

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

$ git checkout --track origin/experimental

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

79 голосов
/ 16 сентября 2008

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

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

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

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

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

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

57 голосов
/ 16 сентября 2008

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

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

git checkout -b branch origin/branchname
50 голосов
/ 15 мая 2013

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

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

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

...