Отслеживать все удаленные ветки git как локальные ветки

Отслеживание одной удаленной ветки как локальной ветки достаточно просто.

$ git checkout --track -b ${branch_name} origin/${branch_name}

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

$ git push --all origin

Я хочу сделать обратное. Если у меня есть X число удаленных ветвей в одном источнике:

$ git branch -r 
branch1
branch2
branch3
.
.
.

Можно ли создавать локальные ветки отслеживания для всех этих удаленных веток без необходимости вручную создавать их? Скажите что-то вроде:

$ git checkout --track -b --all origin

У меня есть googled и RTM, но до сих пор придумали койку.

Ответы

Ответ 1

Использование bash:

после мерзавца 1.9.1
for i in 'git branch -a | grep remote | grep -v HEAD | grep -v master'; do git branch --track ${i#remotes/origin/} $i; done

credits: Val Blant, elias, и Hugo

перед мерзавцем 1.9.1

Примечание: следующий код, если он используется в более поздних версиях git (> v1.9.1), вызывает

  1. (ошибка) Все созданные ветки для отслеживания мастер
  2. (раздражение) Все созданные имена локальных веток должны иметь префикс origin/
for remote in 'git branch -r '; do git branch --track $remote; done

Обновите ветки, если в локальных ветвях отслеживания нет изменений:

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

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

Ответ 2

Ответ, данный Отто, хорош, но все созданные ветки будут иметь "origin/" как начало имени. Если вы хотите, чтобы последняя часть (после последнего /) была вашим результирующим именем ветки, используйте это:

for remote in `git branch -r | grep -v /HEAD`; do git checkout --track $remote ; done

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

Ответ 3

Вот мой однострочный я использую (в оболочке bash, проверенной с помощью msysgit1.7.4):

Для копирования-вставки:

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 ; // 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; 
done
  • он будет выбирать только ветки восходящего потока из удаленного объекта, указанного в переменной remote (это может быть "origin" или любое другое имя, которое вы установили для одного из пультов вашего текущего репозитория Git).
  • он выберет имя ветки: origin/a/Branch/Name => a/Branch/Name через выражение awk.
  • он установит верхнюю ветвь через --set-upstream-to (или -u), а не --track:
    Преимущество состоит в том, что, если ветвь уже существует, она не будет терпеть неудачу и не изменит происхождение ветки, она настроит только настройку branch.xxx.(remote|merge).

    branch.aBranchName.remote=origin
    branch.aBranchName.merge=refs/heads/a/Branch/Name
    

Эта команда создаст локальные ветки для всех удаленных ветвей вверх и установит их настройку удаленного и слияния в эту удаленную ветвь.

Ответ 4

Большинство ответов здесь более усложняют синтаксический анализ вывода git branch -r. Вы можете использовать следующий цикл for, чтобы создать ветки отслеживания по всем ветвям на удаленном компьютере, например.

Пример

Скажем, что у меня эти удаленные ветки.

$ git branch -r
  origin/HEAD -> origin/master
  origin/development
  origin/integration
  origin/master
  origin/production
  origin/staging

Подтвердите, что мы уже не отслеживаем ничего, кроме мастера, локально:

$ git branch -l    # or using just git branch
* master

Вы можете использовать этот один вкладыш для создания ветвей отслеживания:

$ for i in $(git branch -r | grep -vE "HEAD|master"); do 
    git branch --track ${i#*/} $i; done
Branch development set up to track remote branch development from origin.
Branch integration set up to track remote branch integration from origin.
Branch production set up to track remote branch production from origin.
Branch staging set up to track remote branch staging from origin.

Теперь подтвердите:

$ git branch
  development
  integration
* master
  production
  staging

Чтобы удалить их:

$ git br -D production development integration staging 
Deleted branch production (was xxxxx).
Deleted branch development (was xxxxx).
Deleted branch integration (was xxxxx).
Deleted branch staging (was xxxxx).

Если вы используете переключатель -vv на git branch, вы можете подтвердить:

$ git br -vv
  development xxxxx [origin/development] commit log msg ....
  integration xxxxx [origin/integration] commit log msg ....
* master      xxxxx [origin/master] commit log msg ....
  production  xxxxx [origin/production] commit log msg ....
  staging     xxxxx [origin/staging] commit log msg ....

Разбивка цикла for

Цикл в основном вызывает команду git branch -r, отфильтровывая любые HEAD или главные ветки на выходе с помощью grep -vE "HEAD|master". Чтобы получить имена только ветвей минус подстрока origin/, мы используем Bash string manipulation ${var#stringtoremove}. Это приведет к удалению строки "stringtoremove" из переменной $var. В нашем случае мы удаляем строку origin/ из переменной $i.

ПРИМЕЧАНИЕ: В качестве альтернативы вы также можете использовать git checkout --track ...:

$ for i in $(git branch -r | grep -vE "HEAD|master" | sed 's/^[ ]\+//'); do 
    git checkout --track $i; done

Но я не особо забочусь об этом методе, так как он переключает вас между ветвями, когда он выполняет проверку. Когда это будет сделано, он оставит вас на последней ветки, которую он создал.

Ссылки

Ответ 5

Вы могли бы script сделать это достаточно легко, но я не знаю, когда это было бы ценно. Те ветки довольно быстро отстают, и вам придется обновлять их все время.

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

Ответ 6

for i in `git branch -a | grep remote`; do git branch --track ${i#remotes/origin/} $i; done

Ответ 7

Если вы хотите использовать powershell, а ваш пульт называется источником. Тогда это работает.

git fetch    
git branch -r  | %{$_ -replace "  origin/"} | %{git branch --track $_ "origin/$_"}

Ответ 8

без каких-либо скриптов (в пустом каталоге):

$ git clone --bare repo_url .git
$ git config core.bare false
$ git checkout

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


оригинал (на русском).

Ответ 9

for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master`; do  git branch --track ${branch##*/} $branch; done

Используйте это, и у вас не будет такого предупреждения, как: refname 'origin/dev' неоднозначно

Ответ 10

Вот мое решение команды BASH, ссылающееся на @tjmcewan:

for remote in `git branch -r | grep -v /HEAD `; do git branch --track ${remote/"origin/"/""}; done

Моя цель - решить проблему, что все созданные ветки будут иметь "origin/" в качестве начала имени, потому что я тестировал, что $remote variables по-прежнему включают "origin/":

for remote in `git branch -r | grep -v /HEAD`; do echo $remote ; done

Ответ 11

Чтобы сделать то же самое, что ответ tjmcewan, но в Windows вызовите это из командного файла:

for /f "delims=" %%r in ('git branch -r ^| grep -v master') do git checkout --track %%r

Или это из командной строки :

for /f "delims=" %r in ('git branch -r ^| grep -v master') do git checkout --track %r

Ответ 12

Если у вас уже есть ветки, и вы хотите

  • проверьте все оставшиеся ветки с удаленного устройства
  • убедитесь, что все локальные ветки отслеживают удаленные ветки.

вы можете использовать следующие bash - и zsh-совместимые script:

git branch -r | while read b; do if git branch | grep -q " ${b##*/}$"; then git branch --set-upstream ${b##*/} $b; else git branch --track ${b##*/} $b; fi; done

Ответ 13

for rembranch in `git remote update 2>&1 > /dev/null ; git branch -r|egrep -wv "HEAD|master"`
do 
    git checkout --track -b `echo $rembranch|awk -F\/ '{print $2}'` $rembranch; 
done

Пояснение:

строка 1: 'git branch -r' (за ней следует 'git удаленное обновление' для обновления информации об изменениях на удаленном компьютере) перечислены все удаленные ветки; 'egrep -vw' используется для детонации записей, имеющих HEAD и master в результате.

строка 3: Отслеживание именованной удаленной ветки при ее локальном обнаружении. Простой awk используется, чтобы избежать "origin/", являющегося суффиксом для локальных ветвей.

Ответ 14

Используя bash, Если вы хотите оформить заказ во всех ветких:

for remote in 'git branch -r'; do git checkout $(echo $remote | cut -d'/' -f 2); done

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