git вытащить все ветви из удаленного репозитория

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

если я типа:

git branch -a

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

git branch 

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

как я тяну все ветви в мой локальный список?

Я знаю, что могу сделать:

git checkout --track origin/branch-name

но вот тянет и проверяет только одну ветку за раз. Любой способ сделать все это сразу без всей этой утомительной работы бег!--19-->git checkout --отслеживать происхождение / название филиала снова и снова и снова?


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

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

4 ответов


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

remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/[^\/]+\//,"",); print }'`; 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(/[^\/]+\//,"",); print }'`; 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(/[^\/]+\//,"",); print }'
`; do 
  git branch --set-upstream-to $remote/$brname $brname; 
  # or
  git branch --track $brname  $remote/$brname ; 
done

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


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

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

  • fetch: получение содержимого (или обновлений) из удаленного РЕПО
  • pull: fetch (как указано выше) и объединить в один шаг

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

если вы видите ветви, в 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 и some-branch еще не существует, но remotes / origin / some-branch существует, git создаст ветку отслеживания под названием some-branch для вас (1). Опять же, это локальная операция, все данные были извлечены ранее (или если вы недавно не получили, вы начнете работать над устаревшей версией). Первоначально содержимое ветви отслеживания идентично ее удаленной ветви. Однако ветвь отслеживания может быть изменена локально.

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

так может ли вопрос быть вызван недоразумением, предполагая, что удаленные ветви будут храниться только удаленно, но не локально, и вы просто хотели убедиться, что у вас есть все локальное? Если вы действительно хотите иметь более одной ветви, вы можете клонировать свое РЕПО локально и проверять разные ветви в разных рабочих областях. (2)

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

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

(2) появилась новая функция git worktree для этого случая использования. Однако по состоянию на начало 2018 года он по-прежнему отмечен экспериментальным


Вы Должны Попробовать Что-То Вроде:-

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

Я всегда использовал это, и это работает прекрасно

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all