Установите git, чтобы тянуть и толкать все ветви - PullRequest
526 голосов
/ 16 декабря 2009

По умолчанию я хочу нажать и вытащить все ветви, включая вновь созданные.

Есть ли настройка, которую я могу определить для нее?

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

Я создал новую ветку с тем же именем и попытался вытащить, но это не работает. Спрашивает у меня все удаленные конфиги ветки. Как мне это установить.

Ответы [ 9 ]

1143 голосов
/ 07 мая 2012

Самый простой способ сделать это:

git push --all origin

Это подтолкнет теги и ветви.

143 голосов
/ 16 декабря 2009

С современным git вы всегда выбираете все ветви (как ветви с удаленным отслеживанием в пространстве имен refs/remotes/origin/*, видимом с git branch -r или git remote show origin).

По умолчанию (см. Документацию push.default переменная конфигурации) вы нажимаете соответствующие ветви , что означает, что сначала вы должны сделать git push origin branch, чтобы git всегда включал его git push.

Если вы хотите, чтобы всегда выдвигал все ветви , вы можете настроить push refspec. Предполагая, что пульт называется origin, вы можете использовать git config :

$ git config --add remote.origin.push '+refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push '+refs/tags/*:refs/tags/*'

или напрямую отредактируйте файл .git/config, чтобы он выглядел примерно так:

[remote "origin"]
        url = user@example.com:/srv/git/repo.git
        fetch = +refs/heads/*:refs/remotes/origin/*
        fetch = +refs/tags/*:refs/tags/*
        push  = +refs/heads/*:refs/heads/*
        push  = +refs/tags/*:refs/tags/*
32 голосов
/ 09 марта 2011

Включение + в спецификацию push является, вероятно, плохой идеей, поскольку это означает, что git с радостью выполнит push-команду без ускоренной пересылки даже без -f , и если удаленный сервер настроен принять их, вы можете потерять историю.

Попробуйте только это:

$ git config --add remote.origin.push 'refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push 'refs/tags/*:refs/tags/*'
$ git config --add remote.origin.fetch 'refs/heads/*:refs/remotes/origin/*'
$ git config --add remote.origin.fetch 'refs/tags/*:refs/tags/*'
19 голосов
/ 13 февраля 2016

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

~$ git clone --mirror <url_of_old_repo>
~$ cd <name_of_old_repo>
~$ git remote add new-origin <url_of_new_repo>
~$ git push new-origin master
~$ git push new-origin --mirror

ПРИМЕЧАНИЕ : При клонировании репо из Atlassian Stash в AWS CodeCommit (пустое репо) мне пришлось использовать вторую последнюю команду (т. Е. Push master) , Я не уверен, что причина, но после нажатия (git push new-origin --mirror) ветвь по умолчанию ссылалась на какую-то другую ветвь, отличную от master.

11 голосов
/ 18 апреля 2013

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

for remote in `git branch -r | grep -v '\->'`; do git branch --track $remote; done

Затем добавьте ваше новое удаленное репо:

git remote add bb <path-to-new-repo>

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

git push -u bb --all

Или вы можете настроить репо, используя команды git config, указанные в других ответах, если вы не делаете это один раз или только хотите переместить локальные ветви.

Важный момент, остальные ответы только подталкивают все ЛОКАЛЬНЫЕ ветви. Если ветви существуют только в альтернативном REMOTE-репозитории, они не будут перемещаться без предварительного их отслеживания. Цикл for, представленный здесь, поможет с этим.

5 голосов
/ 15 января 2015

Чтобы увидеть все ветви без git branch -a, вам нужно выполнить:

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

Теперь вы можете видеть все ветви:

git branch

Чтобы нажать на все ветви, попробуйте:

git push --all
3 голосов
/ 29 марта 2017

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

for remote in `git branch -r | grep -v '\->' | grep -v master`; do git branch --track `echo $remote|sed 's=origin/=='` `echo $remote`; done

Эта однострочная команда основана на ее версиях в других ответах на этой странице, но, возможно, лучше, потому что:

  1. он правильно настраивает отслеживание ветвления, в отличие от некоторых более старых вариантов этой команды на этой странице, которые предоставляют только один параметр для --track, и, таким образом, каждая ветвь заканчивается мастером отслеживания - не хорошо
  2. называет локальные филиалы без префикса «origin /», который лично мне не нужен, и согласуется с тем, что происходит, когда вы оформляете ветку в обычном режиме.
  3. пропускает мастер отслеживания, поскольку это уже происходит
  4. на самом деле ничего не оформляет, поэтому быстро
  5. избегает спотыкаться о -> в выводе git branch -r

Далее, если вы переключаете источники, замените ссылку на старый источник и укажите новый пульт. Сначала убедитесь, что вы создаете новый пульт, используя графический интерфейс bitbucket / github, но не добавляйте в него какие-либо файлы, иначе возникнет проблема слияния. Э.Г.

git remote set-url origin git@bitbucket.org:YOUR/SOMEREPO.git

Теперь нажмите. Обратите внимание, что вторая команда необходима и для добавления тегов:

git push -u --all origin
git push --tags origin
0 голосов
/ 18 июня 2017

Решение без жесткого кодирования origin в конфигурации

Используйте следующее в global gitconfig

[remote]
    push = +refs/heads/*
    push = +refs/tags/*

Это выдвигает все ветви и все теги

Почему вы НЕ должны жестко кодировать origin в конфигурации?

Если вы жестко закодировали:

  1. Вы получите origin в качестве пульта во всех репозиториях. Таким образом, вы не сможете добавить источник, но вам нужно использовать set-url.
  2. Если инструмент создает пульт с другим именем, то все настройки не будут применены. Тогда вам придется переименовать пульт, но переименование не будет работать, потому что origin уже существует (из пункта 1), помните:)

За загрузкой позаботился уже современный git

Согласно ответу Якуба Наребского:

С современным git вы всегда выбираете все ветви (как ветки с удаленным отслеживанием в refs / remotes / origin / * пространство имен

0 голосов
/ 14 ноября 2016
for b in $(git branch -a | grep -v master | \
sed -e "s|remotes\/origin\/\(.*\)|\1|g"); do git checkout $b && \
git push origin $b; done
...