Установите git, чтобы тянуть и толкать все ветви


616

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

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

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

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


4
«и пытался вытащить, но это не сработало». Подробности пожалуйста. Покажите нам, какую команду вы пытались использовать.
Якуб Наребски

Ответы:


1298

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

git push --all origin

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


10
Среди десятков ответов, которые я нашел в SO и других местах, это самый простой способ отправить недавно созданную локальную ветку, не затрагивая конфигурацию. Спасибо!
Андраш Шепешази

174
И если вы добавите -uодин раз, например git push --all origin -u, отслеживание настроено, и после этого вы можете просто использовать git push.
Алек

23
Для git версии 1.7.12.3 мне пришлось использовать git push --tags originдля нажатия всех тегов.
thisgeek

17
Также посмотрите на «--mirror» вместо «--all», этот толчок больше материала
Loda

21
ВНИМАНИЕ: Если у вас есть несколько локальных веток, которые вы не очистили (функции, исправления) - или не очистили должным образом (я), это приведет к затоплению вашего пульта. Черт. И мы только что сделали обрезку. Не уверен, почему у моих местных осталось так много филиалов.
Джек,

147

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

По умолчанию (см. Документацию по push.defaultпеременной config) вы нажимаете соответствующие ветви , что означает, что сначала вы должны сделать, 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файл так, чтобы он был примерно таким:

[удаленное "происхождение"]
        url = user@example.com: /srv/git/repo.git
        fetch = + refs / heads / *: refs / remotes / origin / *
        fetch = + refs / tags / *: refs / tags / *
        нажать = + ссылки / головы / *: ссылки / головы / *
        push = + refs / tags / *: refs / tags / *

3
@Merc: git push --all originподходит для однократной публикации всех веток и тегов, хотя по умолчанию вплоть до «соответствующей» семантики текущей версии будет означать, что вы будете толкать все ветви потом ... если вы не добавите новую ветку или тег. Установка на «толчок [...] все ветви по умолчанию» будет , как написано.
Якуб Наренбский

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

3
Это изменилось с git 2.0. Push по умолчанию прост, больше не соответствует.
Майк

Я попробовал это и получил ошибку при нажатии: fatal: Invalid refspec ''+refs/heads/*:refs/heads/*'' (Примечание: я нахожусь на git 2.0. Я все еще работаю над тем, как это исправить.)
Брайан Лейси

2
Теперь значение по умолчанию для push.defaultis simple.
hasanghaforian

32

Включение + в спецификации 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/*'

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

К сожалению, git автоматически добавляет + при выполнении git remote add.
Ether

27

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

~$ 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 first ). Я не уверен, что причина, но после нажатия ( git push new-origin --mirror) ветка по умолчанию ссылалась на какую-то другую ветку, чем master.


1
Идеально подходит для переноса репо на другой хост. Спасибо!
Pelmered

2
Это действительно единственный полезный метод. Используйте git push new_origin --allтолько подтолкнуть ваши текущие локальные ветви к new_origin, а не ко всем веткам происхождения.
yanzi1225627

Просто отметив, что это делает --bareхранилище, которое немного отличается от обычного хранилища, в нем есть только .gitфайлы, а не ваши файлы. Это вполне достаточно, если вы не собираетесь работать в нем. Смотрите --bareи --mirror git-scm.com/docs/git-clone .
Jmmut

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

Это был спасатель! Этот метод «мастер до зеркала» исправил проблему, когда Bitbucket был местом назначения, а основной ветвью была ветвь, отличная от «master».
Тоддиус Жо

12

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

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 поможет в этом.


Кстати, я использую «bb» вместо «origin», потому что я предполагаю, что ваш оригинальный / старый репозиторий был назван «origin» и, вероятно, все еще прикреплен к этому ярлыку. «bb» - для Bitbucket, куда я перенес свое первоначальное репо, но вы можете назвать его более подходящим, например, «neworigin», если хотите.
Ланс Кливленд

2
Это не сработало для меня. Завершено всеми удаленными ветвями, отслеживающими одну и ту же локальную ветвь: /
jhsowter

2
AFAIK это не должно работать, согласно @jhsowter комментарию. для меня правильная команда отследить удаленную ветвь во вновь клонированном репо, в git branch --track reponame origin/reponameпротивном случае вы будете отслеживать все удаленные ветки в текущей локальной ветке
Pioneer Skies

Я изменил фрагмент сбора репо на git branch -r | grep -v '\->' | sed 's/ origin\///', который дает только имя удаленной ветви.
Пол Хикс

6

Чтобы увидеть все ветви без использования, 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

1
λ git fetch - все происхождение фатально: fetch - все не принимает аргумент хранилища
foxundermon

ты пытаешься git fetch --all?
Тохи

4

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

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

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

Используйте следующее в вашем глобальном gitconfig

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

Это подталкивает все ветви и все теги

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

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

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

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

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

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

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