Отслеживайте все удаленные Git-ветки как локальные - PullRequest
154 голосов
/ 18 декабря 2008

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

$ 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

Я гуглил и RTM, но до сих пор дошел до койки.

Ответы [ 14 ]

181 голосов
/ 23 июня 2010

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

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

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

91 голосов
/ 19 декабря 2008

Использование 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

кредитов: Вэл Блант, Элиас и Хьюго

перед мерзавцем 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, похоже, предпочитает локальную ветку, как и должно.

22 голосов
/ 10 июня 2011

Вот мой однострочный текст, который я использую (в оболочке 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
    

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

19 голосов
/ 01 декабря 2014

Большинство ответов здесь чрезмерно усложняют разбор результата 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 ....

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

Цикл в основном вызывает команду git branch -r, отфильтровывающую любые HEAD или главные ветви в выводе, используя grep -vE "HEAD|master". Чтобы получить имена только ветвей минус подстрока origin/, мы используем манипуляцию строк в Bash ${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

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

Ссылки

12 голосов
/ 18 декабря 2008

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

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

8 голосов
/ 08 мая 2014
for i in `git branch -a | grep remote`; do git branch --track ${i#remotes/origin/} $i; done
6 голосов
/ 20 мая 2016

без каких-либо сценариев (в пустой директории):

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

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


оригинал .

4 голосов
/ 24 марта 2016

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

git fetch    
git branch -r  | %{$_ -replace "  origin/"} | %{git branch --track $_ "origin/$_"}
3 голосов
/ 05 мая 2017

Вот мое решение команды BASH со ссылкой на @tjmcewan:

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

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

for remote in `git branch -r | grep -v /HEAD`; do echo $remote ; done
3 голосов
/ 21 января 2013
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master`; do  git branch --track ${branch##*/} $branch; done

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

...