Отслеживать все удаленные ветки 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), вызывает
- (ошибка) Все созданные ветки для отслеживания мастер
- (раздражение) Все созданные имена локальных веток должны иметь префикс
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
Важно отметить, что когда вы выполняете выборку, которая выводит из строя новые ветки удаленного отслеживания, у вас автоматически нет локальных, редактируемых их копий.