Git вытащить все ветки из удаленного хранилища

Как перенести все удаленные ветки в мой собственный репозиторий?

если я набираю:

git branch -a

Я получаю длинный список ветвей, но если я наберу:

git branch 

Я вижу только 2 из них.

Как я могу втянуть ветки ВСЕ в мой локальный список?

Я знаю, что могу:

git checkout --track origin/branch-name

но это затягивает и проверяет только одну ветвь за раз. Любой способ сделать все это сразу без этой утомительной работы по запуску git checkout --track origin/branch-name снова и снова?


пс. Я пробовал следующие команды, ни один из них не делал удаленные ветки в моем списке git branch:

git fetch --all
git remote update
git pull --all

Ответ 1

Команда, которую я обычно использую, чтобы сделать все видимые ветки вверх по течению, а отслеживание их подробно описано в разделе "Отслеживать все удаленные ветки git как локальные ветки:

remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/[^\/]+\//,"",$1); print $1}'`; do git branch --set-upstream-to $remote/$brname $brname ; done

Или:

remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/[^\/]+\//,"",$1); print $1}'`; do git branch --track $brname $remote/$brname  ; done

Для большей читаемости:

remote=origin ; // put here the name of the remote you want
for brname in `
  git branch -r | grep $remote | grep -v master | grep -v HEAD 
  | awk '{gsub(/[^\/]+\//,"",$1); print $1}'
`; do 
  git branch --set-upstream-to $remote/$brname $brname; 
  # or
  git branch --track $brname  $remote/$brname ; 
done

Второй - для создания новых локальных ветвей, отслеживающих удаленные ветки.

Ответ 2

Чтение, например. это объяснение http://git-scm.com/book/en/Git-Branching-Remote-Branches

Сначала проясним некоторую терминологию git:

  • fetch: получение содержимого (или обновлений) из удаленного репо
  • pull: fetch (как указано выше) и слияние за один шаг

Оригинальный плакат не упоминал о слиянии, поэтому я мог бы догадаться, что в правильной терминологии git он даже мог бы спросить "git fetch все ветки из удаленного хранилища"

Если вы видите ветки в git branch -a, вы уже вывели их. Вы можете проверить это, указав команду git show remotes/origin/some-branch:some-file

Или можно сделать, например. git diff remotes/origin/some-branch master

Вы даже можете проверить их git checkout remotes/origin/some-branch

(Чтобы убедиться, что вы можете удалить сетевой кабель, и вы увидите, что команды работают без обращения к удаленному репо.)

Филиалы с именем remotes/... называются удаленными ветвями, но они уже выведены на ваш репо. Они доступны только для чтения, вы не можете их изменять (поэтому при выводе сообщения появляется сообщение). Хотя они отражают состояние удаленного репо во время последней операции выборки или выталкивания, они фактически хранятся локально.

Если вы выполняете git checkout some-branch, а некоторая ветвь еще не существует, но существует пульт дистанционного управления /origin/some -branch, git создаст ветку отслеживания, называемую некоторой веткой для вас (1). Опять же, это локальная операция, все данные были получены до (или если вы еще не выбрали, вы начнете работать с устаревшей версией). Первоначально содержимое ветки отслеживания идентично содержимому ветки отслеживания. Однако ветвь отслеживания может быть изменена вами локально.

Рабочая область git содержит состояние одной ветки в момент времени. Поэтому ваш вопрос о проверке всех удаленных веток сразу не имеет смысла в контексте git. Вы можете проверить их один за другим. Но каждый раз, когда вы проверяете следующий, предыдущий исчезает из рабочей зоны. Конечно, эта операция может быть написана сценарием, как показано в Отслеживать все удаленные ветки git как локальные ветки. Но в чем смысл сценария массовой операции, если только его последний шаг что остается?

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

В ближайшее время. Если вы хотите быть уверены, что у вас есть все доступные данные локально, находящиеся в дистанционное репо просто используйте git fetch [repo]. Если вы не настроили свою конфигурацию, это приведет к извлечению всех ветвей, т.е. Обновлению существующих удаленных веток, а также созданию новых удаленных приложений, если это применимо.

(1) Это справедливо в простых стандартных случаях. В более сложных случаях с более чем одним удаленным или настроенным вручную пультом дистанционного управления вам может понадобиться опция --track, чтобы указать, что именно вы хотите.

Ответ 3

Вы должны попробовать что-то вроде: -

$ git fetch --all
$ for branch in `git branch -r | cut -d '/' -f2` ; do git checkout $branch && git pull origin $branch ; done