Как получить все ветки Git

Я клонировал Git-репозиторий, который содержит около пяти веток. Однако, когда я делаю git branch я вижу только одну из них:

$ git branch
* master

Я знаю, что могу сделать git branch -a чтобы увидеть все ветки, но как бы я вытянул все ветки локально, чтобы при выполнении git branch это показывало следующее?

$ git branch
* master
* staging
* etc...
+1237
25 апр. '12 в 9:05
источник поделиться
30 ответов

Вы можете получить все ветки со всех пультов, как это:

git fetch --all

Это в основном силовой ход.

fetch обновляет локальные копии удаленных веток, так что это всегда безопасно для ваших локальных веток, НО:

  1. fetch не будет обновлять локальные ветки (которые отслеживают удаленные ветки); если вы хотите обновить свои локальные ветки, вам все равно нужно тянуть каждую ветку.

  2. fetch не будет создавать локальные ветки (которые отслеживают удаленные ветки), вы должны сделать это вручную. Если вы хотите перечислить все удаленные ветки: git branch -a

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

git pull --all

Однако этого может быть недостаточно. Это будет работать только для ваших локальных веток, которые отслеживают удаленные ветки. Для отслеживания всех удаленных веток выполните этот oneliner ПЕРЕД git pull --all:

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

TL; DR версия

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

(Кажется, что pull извлекает все ветки со всех пультов, но я всегда выбираю сначала, чтобы быть уверенным.)

Выполните первую команду, только если на сервере есть удаленные ветки, которые не отслеживаются вашими локальными веткими.

PS AFAIK git fetch --all и git remote update эквивалентны.



Комментарий Камиля Шота, который люди сочли полезным.

Я должен был использовать:

for remote in 'git branch -r'; do git branch --track ${remote#origin/} $remote; done

потому что ваш код создал локальные ветки с именем origin/branchname и я получал "refname 'origin/branchname" неоднозначно всякий раз, когда я ссылался на него.

+1666
25 апр. '12 в 9:10
источник

Связанные вопросы


Похожие вопросы

Список удаленных веток:
git branch -r

Вы можете проверить их как локальные ветки с помощью:
git checkout -b LocalName origin/remotebranchname

+578
25 апр. '12 в 10:00
источник

Вам нужно будет создавать локальные ветки, отслеживающие удаленные ветки.

Предполагая, что у вас есть только один удаленный узел с именем origin, этот фрагмент создаст локальные ветки для всех удаленных отслеживающих:

for b in 'git branch -r | grep -v -- '->''; do git branch --track ${b##origin/} $b; done

После этого git fetch --all обновит все локальные копии удаленных веток.

Кроме того, git pull --all обновит ваши локальные ветки отслеживания, но в зависимости от ваших локальных коммитов и от того, как настроен параметр конфигурации 'merge', он может создать коммит слияния, ускоренную перемотку вперед или сбой.

+177
17 янв. '14 в 15:33
источник

Если вы выполните:

git fetch origin

то они все будут локально. Если вы затем выполните:

git branch -a

вы увидите, что они перечислены как remotes/origin/branch-name. Поскольку они там локально, вы можете делать все, что угодно, с ними. Например:

git diff origin/branch-name 

или

git merge origin/branch-name

или

git checkout -b some-branch origin/branch-name
+106
25 апр. '12 в 13:52
источник
$ git remote update
$ git pull --all

Это предполагает, что все ветки отслеживаются.

Если это не так, вы можете запустить это в Bash:

for remote in 'git branch -r '; do git branch --track $remote; done

Затем запустите команду.

+58
25 апр. '12 в 9:07
источник

Используйте git fetch && git checkout RemoteBranchName.

Это работает очень хорошо для меня...

+45
08 мая '14 в 16:14
источник

Цикл Bash for не работал для меня, но он сделал именно то, что я хотел. Все ветки моего происхождения зеркально отображались как одноименные локально.

git checkout --detach
git fetch origin '+refs/heads/*:refs/heads/*'

Смотрите комментарий Майка Дюпона ниже. Я думаю, что пытался сделать это на сервере Jenkins, который оставляет его в режиме отсоединенной головы.

+44
28 окт. '13 в 20:02
источник

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

$ git branch -a

вы можете показать все ветки репозитория и с помощью команды

$ git checkout -b branchname origin/branchname

вы можете "загрузить" их вручную по одному.


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

  • Первый шаг

    создать новую пустую папку на вашем компьютере и клонировать зеркальную копию .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" с терминала.

  • Второй шаг

    переключите этот репозиторий из пустого (голого) репозитория в обычный репозиторий, переключив логическое значение "голый" из конфигураций git на false:

    $ git config --bool core.bare false
    
  • Третий шаг

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

    $ git reset --hard
    

Итак, теперь вы можете просто ввести команду git branch, и вы увидите, что все ветки загружены.

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

+32
06 дек. '15 в 20:12
источник

Вы можете получить все ветки:

git fetch --all

или же:

git fetch origin --depth=10000 $(git ls-remote -h -t origin)

Параметр --depth=10000 может помочь, если вы заделали хранилище.


Чтобы вытащить все ветки, используйте:

git pull --all

Если вышеприведенное не сработает, то перед этой командой введите:

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

так как remote.origin.fetch может поддерживать только определенную ветку при получении, особенно когда вы клонировали свое хранилище с помощью --single-branch. Проверьте это: git config remote.origin.fetch.

После этого вы сможете оформить заказ в любом отделении.

Смотрите также:


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

git push --all

в конце концов --mirror чтобы отразить все ссылки.


Если ваша цель - дублировать репозиторий, см.: Дублирование статьи о репозитории на GitHub.

+24
11 окт. '16 в 20:04
источник

Я обычно использую ничего, кроме команд вроде этого:

git fetch origin
git checkout --track origin/remote-branch

Немного короче:

git fetch origin
git checkout -t origin/remote-branch
+24
07 июл. '14 в 14:42
источник

Я полагаю, что вы клонировали хранилище:

git clone https://github.com/pathOfrepository

Теперь перейдите в эту папку с помощью CD:

cd pathOfrepository

Если вы git status вы увидите все:

   On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

Чтобы увидеть все скрытые типы веток:

 git branch -a

В нем будут перечислены все удаленные ветки.

Теперь, если вы хотите оформить заказ на какую-либо конкретную ветку, просто наберите:

git checkout -b localBranchName origin/RemteBranchName
+15
23 сент. '16 в 10:06
источник

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

git clone <ORIGINAL_ORIGIN>
git branch -r | awk -F'origin/' '!/HEAD|master/{print $2 " " $1"origin/"$2}' | xargs -L 1 git branch -f --track 
git fetch --all --prune --tags
git pull --all

git remote set-url origin <NEW_ORIGIN>
git pull
<resolve_any_merge_conflicts>
git push --all
git push --tags
<check_NEW_ORIGIN_to_ensure_it_matches_ORIGINAL_ORIGIN>
+14
05 февр. '14 в 23:55
источник

После клонирования основного репозитория вы можете выполнить

git fetch && git checkout <branchname>
+12
10 февр. '14 в 8:50
источник

Убедитесь, что все удаленные ветки выбраны в файле .git/config.

В этом примере ветвь origin/production является fetchable, даже если вы пытаетесь сделать git fetch --all ничего не произойдет, но извлечение ветки production:

[origin]
fetch = +refs/heads/production:refs/remotes/origin/production

Эта строка должна быть заменена на:

[origin]
fetch = +refs/heads/*:refs/remotes/origin/*

Затем запустите git fetch и т.д.

+9
19 сент. '17 в 8:43
источник

Цикл, похоже, не работал у меня, и я хотел проигнорировать происхождение/мастер. Вот что сработало для меня.

git branch -r | grep -v HEAD | awk -F'/' '{print $2 " " $1"/"$2}' | xargs -L 1 git branch -f --track

После этого:

git fetch --all
git pull --all
+9
04 дек. '13 в 5:09
источник

Именно эти три команды получат все ветки:

git clone --mirror repo.git  .git     (gets just .git  - bare repository)

git config --bool core.bare false

git reset --hard
+7
27 авг. '15 в 1:27
источник

Я написал немного script для управления клонированием нового репо и создания локальных ветвей для всех удаленных ветвей.

Вы можете найти последнюю версию здесь:

#!/bin/bash

# Clones as usual but creates local tracking branches for all remote branches.
# To use, copy this file into the same directory your git binaries are (git, git-flow, git-subtree, etc)

clone_output=$((git clone "$@" ) 2>&1)
retval=$?
echo $clone_output
if [[ $retval != 0 ]] ; then
    exit 1
fi
pushd $(echo $clone_output | head -1 | sed 's/Cloning into .\(.*\).\.\.\./\1/') > /dev/null 2>&1
this_branch=$(git branch | sed 's/^..//')
for i in $(git branch -r | grep -v HEAD); do
  branch=$(echo $i | perl -pe 's/^.*?\///')
  # this doesn't have to be done for each branch, but that how I did it.
  remote=$(echo $i | sed 's/\/.*//')
  if [[ "$this_branch" != "$branch" ]]; then
      git branch -t $branch $remote/$branch
  fi
done
popd > /dev/null 2>&1

Чтобы использовать его, просто скопируйте его в каталог git bin (для меня, thats C:\Program Files (x86)\Git\bin\git-cloneall), затем в командной строке:

git cloneall [standard-clone-options] <url>

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

+4
13 июн. '14 в 20:05
источник

Вот что я считаю надежным:

  • Не обновляет удаленное отслеживание для существующих веток
  • Не пытается обновить HEAD для отслеживания origin/HEAD
  • Позволяет удаленным именам, отличным от origin
  • Правильно оформленная оболочка
for b in $(git branch -r --format='%(refname:short)'); do
  [[ "${b#*/}" = HEAD ]] && continue
  git show-ref -q --heads "${b#*/}" || git branch --track "${b#*/}" "$b";
done
git pull --all

Нет необходимости выполнять git fetch --all поскольку передача -all для git pull передает эту опцию во внутреннюю fetch.

Отдайте этому ответу.

+3
14 сент. '18 в 15:47
источник

Для пользователей Windows, использующих PowerShell:

git branch -r | ForEach-Object {
    # Skip default branch, this script assumes
    # you already checked-out that branch when cloned the repo
    if (-not ($_ -match " -> ")) {
        $localBranch = ($_ -replace "^.*/", "")
        $remoteBranch = $_.Trim()
        git branch --track "$localBranch" "$remoteBranch"
    }
}
git fetch --all
git pull --all
+2
15 июл. '17 в 23:43
источник

Вот Perl-версия однострочника, приведенная в принятом ответе:

git branch -r | perl -e 'while(<>) {chop; my $remote = $_; my ($local) = ($remote =~/origin\/(.*)/); print "git branch --track $local $remote\n";}' > some-output-file

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

Мы случайно удалили наш репозиторий проекта Stash. К счастью, кто-то создал вилку прямо перед случайной потерей. Я клонировал вилку на свой локальный (опущу детали того, как я это сделал). После того, как я полностью освоил вилку, я запустил одну однострочную. Я изменил удаленный URL (источник в моем случае), чтобы он указывал на целевой репозиторий, в который мы восстанавливали:

git remote set-url origin <remote-url>

И, наконец, подтолкнул все ветки к происхождению так:

git push --all origin

и мы вернулись в бизнес.

+2
26 окт. '18 в 19:04
источник

Как получить все отслеживания веток Git Single Remote.

Это было проверено и работает в Red Hat и Git Bash в Windows 10.


TL;DR:

for branch in 'git branch -r|grep -v ' -> '|cut -d"/" -f2'; do git checkout $branch; git fetch; done;

Объяснение:

Один лайнер проверяет и затем выбирает все ветки, кроме HEAD.

Перечислите ветки удаленного слежения.

git branch -r

Игнорировать ГОЛОВУ.

grep -v ' -> '

Снимите название ветки с пульта (ов).

cut -d"/" -f2

Оформить заказ на все ветки, отслеживая один пульт.

git checkout $branch

Выбрать для проверенной ветки.

git fetch

Технически выборка не нужна для новых локальных веток.

Это может быть использовано для fetch или pull веток, которые являются как новыми, так и с изменениями в удаленном (ых).

Просто убедитесь, что вы тянете, только если вы готовы к слиянию.


Испытательная установка

Проверьте хранилище с SSH URL.

git clone git@repository.git

До

Проверьте ветки в местном.

$ git branch
* master

Выполнить команды

Выполните один лайнер.

for branch in 'git branch -r|grep -v ' -> '|cut -d"/" -f2'; do git checkout $branch; git fetch; done;

После

Проверьте, что локальные ветки включают удаленные ветки.

$ git branch
  cicd
  master
* preprod
+1
26 апр. '19 в 18:06
источник

Чтобы избежать сообщения об ошибке 'fatal: ветвь с именем' origin/master 'уже существует.', Вам нужно это:

git branch -r | grep -v '\->'  | grep -v 'git branch | awk '/\*/ { print $2; }''| while read remote; do git branch --track "${remote#origin/}" "$remote"; done
+1
16 мар. '19 в 2:31
источник

Если у вас есть проблемы с fetch --all отследите удаленную ветку:

git checkout --track origin/%branchname%
+1
07 нояб. '18 в 10:34
источник

Мы можем поместить все имена ветвей или тегов во временный файл, затем git pull для каждого имени/тега:

git branch -r | grep origin | grep -v HEAD| awk -F/ '{print $NF}' > /tmp/all.txt
git tag -l >> /tmp/all.txt
for tag_or_branch in `cat /tmp/all.txt`; do git checkout $tag_or_branch; git pull origin $tag_or_branch; done
+1
05 июл. '16 в 4:32
источник

Основываясь на ответе Learath2, вот что я сделал после выполнения git clone [...] и cd -включении в созданный каталог:

git branch -r | grep -v master | awk {print\$1} | sed 's/^origin\/\(.*\)$/\1 &/' | xargs -n2 git checkout -b

Работал для меня, но я не могу знать, что это сработает для вас. Будьте осторожны.

0
02 июл. '15 в 15:23
источник
git remote add origin https://yourBitbucketLink

git fetch origin

git checkout -b yourNewLocalBranchName origin/requiredRemoteBranch (use tab :D)

Теперь локально ваш yourNewLocalBranchName является вашим requiredRemoteBranch.

0
20 апр. '16 в 12:43
источник

Для пользователей Visual Studio: на консоли диспетчера пакетов:

мерзавец ветка | % {git fetch upstream; git merge upstream/master} git merge upstream/master}

0
27 мая '19 в 16:30
источник

Это прекрасно работает:

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
0
11 июн. '19 в 9:18
источник

Перепробовал много способов, только этот прост и работает для меня.

for branch in $(git ls-remote -h git@<your_repository>.git | awk '{print $2}' | sed 's:refs/heads/::')
do
  git checkout "$branch"
  git pull
done
0
12 июн. '19 в 2:37
источник
git fetch --all

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

get checkout YOUR_BRANCH

Надеюсь, что это поможет.

0
31 авг. '16 в 11:45
источник

Посмотрите другие вопросы по меткам или Задайте вопрос