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


1509

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

$ git branch
* master

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

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

1
Также обсуждается на stackoverflow.com/questions/67699/…
gliptak

2
Этот вопрос показывает, как получить все ветви после использования --single-branchпараметра при клонировании: stackoverflow.com/questions/17714159/… ( git fetch --allникогда не будет работать, если вы указали только одну ветвь!)
Мэтью Уилкоксон

2
Вы никогда не увидите этот вывод, потому что звездочка представляет ветку, которая в настоящее время извлекается. Поскольку вы можете получить только одну ветку за раз, у вас может быть только одна звездочка слева от вашего списка ветвей.
Робино

5
Я видел много ответов, но ни один из них не упомянул, что, я думаю, возможно, самый простой способ сделать то, что вы хотите: git clone --bare <repo url> .git (обратите внимание, что вам нужно добавить «--bare» и «.git» в конце, чтобы клонировать репо как «голое» РЕПО), затем git config --bool core.bare false(устанавливает для флага «голое» значение «ложь»), затем git reset --hard(переводит ГОЛОВКУ в текущий ГОЛОВ на репо). Теперь, если вам, git branchвы должны увидеть все ветви репо, который вы клонировали.
Габриэль Ферраз

4
@GabrielFerraz Тогда вы злоупотребляете функциональностью комментариев в переполнении стека. Пользователи могут проголосовать за ваш комментарий, но не за него.
труба

Ответы:


2053

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

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


42
Сожалею. Я не могу себе представить, что именно этого на самом деле хочет ОП. Команда «pull» - это «fetch + merge», и часть слияния будет перекрывать все ветви друг над другом, оставляя один гигантский беспорядок.
GoZoner

10
эта выборка не создаст новую удаленную ветку, с которой вам все еще нужно это проверитьgit checkout -b localname remotename/remotebranch
Learath2

125
Мне пришлось использовать, for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done потому что ваш код создавал локальные ветви с именем origin / branchname, и я получал, что «refname 'origin / branchname' неоднозначно всякий раз, когда я ссылался на него
Камил Сзот

22
Я не знаю, использую ли я другую версию GIT, но мне пришлось изменить скрипт на git pull --all; for remote in `git branch -r | grep -v \>`; do git branch --track ${remote#origin/} $remote; done. Изменение снимает ГОЛОВУ.
kim3er

16
Для пользователей Windows:for /F %remote in ('git branch -r') do ( git branch --track %remote) && git fetch --all && git pull --all
Макс.

719

Для просмотра удаленных филиалов:
git branch -r

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


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

12
Даже если ветка не видна локально, я могу сделать, git checkout remotebranchnameи это работает. какая разница с вашим решением?
Франсуа Ромен

12
Его поведение по умолчанию сейчас. Не было случая на старых версиях git. Используется, git checkout remotebranchnameчтобы просто создать новую несвязанную ветку с именем remotebranchname .
Learath2

12
Принятый ответ делает что-то принципиально другое, и,
честно

8
ОП попросил все ветки. Этот ответ только один.
Тед Бигхам

193

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

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

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

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

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


5
Это делает решение против имен ветвей, содержащих метасимволы оболочки (согласно комментарию пинкеена к другому ответу), и позволяет избежать вывода ложных ошибок: git branch -r | grep -v - '->' | пока читаешь пульт; do git branch --track "$ {remote # origin /}" "$ remote" 2> & 1 | grep -v «уже существует»; сделано
Дайра Хопвуд

6
Вы уверены, что git pull --allобновите все локальные ветви отслеживания? Насколько я могу сказать, он только обновляет текущую ветку со всех пультов.
Энди

3
Сделал это. Локальные ветви, соответствующие удаленным ветвям, не были созданы. Что такое команда git, которая просто говорит: «Потяните все удаленные ветви, создавая локальные, если они не существуют?»
JosephK

@JosephK, возможно, ваш пульт не называется origin? Посмотрите этот ответ, который будет работать на всех удаленных именах.
Том Хейл,

@TomHale Это было "происхождение", но спасибо за ваш ответ - хотя сумасшедший, что много нужно сделать, что должно быть один или, может быть, два флага. Я сейчас пытаюсь бездарно, чтобы попытаться избежать безумия некоторых аспектов мерзавца.
JosephK

116

Если вы делаете:

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
Только что нашел эту страницу в Google ... это был реальный тип ответа, который я искал. Я попробовал первую команду, но получил сообщение об ошибке: [$ git fetch - все происхождение фатально: fetch --all не принимает аргумент хранилища] --- Использование "git fetch --all", кажется, помогает. Спасибо за лидерство!
Longda

1
Исправлено (исключено --all)
GoZoner

12
git fetch -allвыбирает все ветви всех пультов. git fetch originвыбирает все ветви пульта origin. Последнее - то, о чем спрашивал ОП.
GoZoner

3
--allозначает «все пульты», а не «все ветви данного пульта». Последнее подразумевается любой выборки с пульта.
космонавт

2
Это не способ вытащить все ветви в локальное репо из удаленного репо.
Владимир Деспотович

69
$ git remote update
$ git pull --all

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

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

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

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


3
Когда я пытаюсь это сделать, я все равно получаю тот же результат, что и выше.
David542

4
Как и @JacobLowe, я получил ошибку, но она все равно сработала; 'fatal: ветвь с именем' origin / master 'уже существует.'
AnneTheAgile

Это уродливо, поскольку он попытается создать ветвь, для ->которой, вероятно, будет существовать выходной файл git branch -r`origin / HEAD -> origin / master`
Том Хейл,

Более того, это не работает. Я получаю вывод: Branch 'origin/quote-filenames' set up to track local branch 'master'. желаемый вывод: Branch 'quote-filenames' set up to track remote branch 'quote-filenames' from 'origin'. это задом наперед , установка источника для отслеживания пульта. Смотрите этот ответ для исправления.
Том Хейл,

как раз то, что мне нужно С тех пор как я сменил Mac, даже после клонирования репо я не смог проверить другие удаленные филиалы и git fetchне работал. Итак, урок заключается в том, что вам нужно отслеживать удаленные ветви. Gracias!
Виктор Рамос

58

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

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

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


6
Это производит fatal: Refusing to fetch into current branch refs/heads/master of non-bare repositoryпосле простого клона. Сначала нужно отсоединить голову. Я сделал это сgit checkout <SHA>
brannerchinese

6
Мое решение с использованием этого git checkout --detach # detach the headи затемgit fetch origin \'+refs/heads/*:refs/heads/*
Майк Дюпон

1
Этот работал для меня, за исключением того, что я также использую параметр --tags. Хотелось бы, чтобы был стандартный, простой интерфейс для git, количество простых вещей в git, которым нужно более 10 ответов о переполнении стека, просто смешно!
Кристианп

1
@kristianp Вы проверили Ungit или GitKraken?
dragon788

@ dragon788 Я использовал SourceTree для git GUI, но я действительно говорил о более простой командной строке для задач сценариев.
Кристианп

51

Использование git fetch && git checkout RemoteBranchName.

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


6
Это новый лучший ответ, вы все. Я не знаю, возможно ли это было раньше, но последние версии Git по крайней мере заметят, что вы пытаетесь извлечь удаленную ветку, и автоматически настроят локальную ветку отслеживания для вас (и вам не нужно уточнять origin/branch, достаточно только сказать branch).
Нил Трафт

9
Это не отвечает на первоначальный вопрос: «Как бы я потянул все ветви локально?» Это тянет их один за другим, что не масштабируется.
ingyhere

Это был единственный ответ, который позволял мне тянуть удаленные ветви в любой ситуации, с которой я сталкивался
Эммануэль Бакши

38

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

$ git branch -a

Вы можете показать все ветви хранилища, и с помощью команды

$ git checkout -b branchname origin/branchname

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


Тем не менее, есть гораздо более чистый и быстрый способ, хотя он немного сложнее. Вам нужно три шага для этого:

  1. Первый шаг

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

  2. Второй шаг

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

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

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

    $ git reset --hard
    

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

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


1
Проголосовал за упоминание скрытых веток. помог мне понять локальное отслеживание филиалов безмерно.
mburke05

Это хороший ответ, но вопрос подразумевает что-то для повседневного использования. Непрактично клонировать хранилище каждый раз.
З. Кулла

Почему сброс создает все ветви локально?
З. Кулла

@ Z.Khullah это не сброс, который создает все ветви, а клон --mirror. К сожалению для нас, это также создает «голое» репо, которое и изменяют шаги 2 и 3.
ScottJ

29

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

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.


1
Круто ... Я попробовал все остальное до вашего решения на этой странице. Большое спасибо!
Sujoy

2
Я использовал мелкое клонирование ( depth=1), и в конфиге также была указана одна конкретная ветвь fetch- depth=1000параметр был исправлением, которое помогло мне
Сандра

2
pull --allне тянет все ветви, но все пульты
Z. Khullah

Хороший трюк с конфигом, хотя!
Принимал

Я проверил конфиг, как вы написали, до сих пор работает только с текущей веткой. Похоже, все ответы здесь не работают для меня ...
Алексей

25

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

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

Немного короче версия:

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

17

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

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

16

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

3
Очень полезно; именно то, что мне было нужно. Единственное, что мне пришлось изменить, было во второй строке, добавив одинарные кавычки вокруг 'HEAD' и 'master'; вероятно, потому что я использую Zsh. Спасибо!
sockmonk

Это в основном делает следующее: (1) Получение реальных имен удаленных веток [не руководитель, не мастер]; (2) Полностью сказать Git, чтобы отслеживать их [не все решения делают это]; (3) Извлечение и извлечение всего из этих веток [включая теги]; (4) Установка нового источника и прохождение толкают абсолютно все. Опять же, большинство других решений не могут сдвинуть все части. Это делает все это.
ingyhere

1
Я удалил антипаттерн запуска grep, затем awk и сжал команды grep в команду awk. Спасибо, тройной !
здесь

Прочитайте это и никогда не пишите git fetch git pull stackoverflow.com/a/292359/1114926
Green

Git pullдействительно делает fetchпервый, но легче определить, является ли проблема fetchчастью pullили последующей mergeчастью того, pullкогда fetchвыполняется независимо.
ingyhere

12

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

git fetch && git checkout <branchname>

1
просто. и работал, чтобы получить ветку из удаленного источника
sirvon

3
Это не отвечает на первоначальный вопрос: «Как бы я потянул все ветви локально?» Это тянет их один за другим, что не масштабируется. Рассмотрим случай с 100 ветками.
ingyhere

10

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

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

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

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

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

Тогда беги и git fetchт.д ...


3
Чтобы проверить: git config --get remote.origin.fetchа затем (разрушительно) установить его:git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
qneill

или измените текстовый файл конфигурации в каталоге .git, у меня
сработало

9

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

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

1
Вариант этого является правильным ответом, но этот не работает во всех крайних случаях. Также названия веток могут быть в стиле фанк. Поэтому я сделал следующее: git branch -r | grep -v ГОЛОВА | grep –v master | awk -F'origin / '' {print $ 2 "" $ 1 "origin /" $ 2} '| xargs -L 1 git branch -f --track; git fetch - all; git pull - все; И ЭТО ТРЮК!
ingehere

3
Стилистическое улучшение, чтобы избежать grep | awk антипаттерна : git branch -r | awk -F 'origin/' '!/HEAD|master/{...
tripleee

7

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

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

git config --bool core.bare false

git reset --hard

Это на самом деле корень проблемы ОП. Если клонировать правильно, ему не нужно будет делать pull --all. Но если все еще нужно, то другой ответ ниже, @Johnno Nola, предполагая, что все ответвления отслеживаются и смешиваются с этим ответом, - это путь.
Доктор Беко

7

Почему никто не отвечает на вопрос ребят и не объясняет, что происходит?

  1. Убедитесь, что вы отслеживаете все удаленные ветви (или те, которые вы хотите отслеживать) .
  2. Обновите ваши локальные ветви, чтобы отразить удаленные ветви.

Отслеживание всех удаленных веток:

Отслеживайте все филиалы, которые существуют в удаленном репо.

Сделайте это вручную:

Вы бы заменили <branch>ветку, которая отображается на выходе git branch -r.

git branch -r
git branch --track <branch>

Сделайте это с помощью bash-скрипта

for i in $(git branch -r | grep -vE "HEAD|master"); do git branch --track ${i#*/} $i; done

Обновите информацию об удаленных филиалах на вашем локальном компьютере:

При этом обновляются ветки удаленного репо, которые вы отслеживаете в своем локальном репо. Это не меняет ваши местные филиалы. Ваше локальное git-репо теперь знает о том, что произошло в ветках удаленного репо. Примером может быть то, что новый коммит был передан на удаленный мастер, выполнение выборки теперь предупредит вас, что ваш локальный мастер отстает на 1 коммит.

git fetch --all

Обновите информацию об удаленных филиалах на вашем локальном компьютере и обновите локальные филиалы:

Выполняет выборку с последующим объединением всех веток от удаленного к локальному. Примером может служить то, что новый коммит был передан на удаленный мастер, выполнение извлечения обновит ваше локальное хранилище об изменениях в удаленной ветви, а затем объединит эти изменения с вашей локальной веткой. Это может создать беспорядок из-за конфликтов слияния.

git pull --all

4

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

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

#!/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's 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 (для меня это так C:\Program Files (x86)\Git\bin\git-cloneall), а затем в командной строке:

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

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


4

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

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


TLDR:

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

4

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

Это работает с ветками с / в имени: 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" } }
Маркус

3

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

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

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


2

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

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


1

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

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

git checkout --track origin/%branchname%

1

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

0

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

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

Сработало для меня, но я не знаю, сработает ли это для вас. Быть осторожен.


0
git remote add origin https://yourBitbucketLink

git fetch origin

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

Теперь локально ваш yourNewLocalBranchNameтвой requiredRemoteBranch.


0

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

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


0

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

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

Установить псевдоним: (на основе верхнего ответа)

git config --global alias.track-all-branches '!git fetch --all && for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done && git fetch --all'

Теперь для отслеживания всех веток:

git track-all-branches

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.