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

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

$ git branch
* master

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

$ git branch
* master
* staging
* etc...

Ответ 1

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

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" неоднозначно всякий раз, когда я ссылался на него.

Ответ 2

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

Ответ 5

$ git remote update
$ git pull --all

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

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

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

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

Ответ 6

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

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

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

Ответ 7

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

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

Ответ 8

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

$ 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 со всеми ветвями одновременно, но это не то, что вы хотите сделать для каждого отдельного проекта таким образом.

Ответ 9

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

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.

Ответ 10

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

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

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

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

Ответ 11

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

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

Ответ 12

Если вы ищете решение, чтобы получить все ветки и затем перенести все на другой 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>

Ответ 13

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

git fetch && git checkout <branchname>

Ответ 14

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

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

Ответ 15

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

Ответ 16

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

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

git config --bool core.bare false

git reset --hard

Ответ 17

Я написал немного 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 "[email protected]" ) 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>

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

Ответ 18

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

  • Не обновляет удаленное отслеживание для существующих веток
  • Не пытается обновить 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.

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

Ответ 19

Как получить все отслеживания веток 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 [email protected]

До

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

$ 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

Ответ 20

Для пользователей 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

Ответ 21

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

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

Ответ 22

Мы можем поместить все имена ветвей или тегов во временный файл, затем 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

Ответ 23

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

git checkout --track origin/%branchname%

Ответ 24

Чтобы избежать сообщения об ошибке '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

Ответ 25

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

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

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

Ответ 26

git remote add origin https://yourBitbucketLink

git fetch origin

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

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

Ответ 27

git fetch --all

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

get checkout YOUR_BRANCH

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

Ответ 28

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

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

Ответ 29

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

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

Ответ 30

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

for branch in $(git ls-remote -h [email protected]<your_repository>.git | awk '{print $2}' | sed 's:refs/heads/::')
do
  git checkout "$branch"
  git pull
done