У меня установлены следующие пульты:
$ git remote
korg
rorg
И следующие ветки:
$ git branch -a
* (no branch)
remotes/korg/gingerbread
remotes/korg/gingerbread-release
remotes/korg/honeycomb
remotes/korg/honeycomb-mr1-release
remotes/korg/master
remotes/m/android-2.3.3_r1 -> refs/tags/android-2.3.3_r1a
remotes/m/gingerbread -> korg/gingerbread
Теперь я хочу перенести все удаленные ветки с korg
на rorg
удаленный. Как я могу это сделать?
Желательно без создания локальной ветки для каждого первого, если этого можно избежать.
git
git-branch
git-push
git-remote
Бьярке Фрейнд-Хансен
источник
источник
Ответы:
Быстрый тест создания временных репозиториев показывает, что вы можете создать refspec, который может это сделать:
Итак происхождение / ФИЛИАЛ: refs / главы / ФИЛИАЛ
Проверяю свой
rorg
пульт:источник
git push rorg origin/one:one
(безrefs/heads/
) вместо этого?refs/heads/
префиксом вы выдвигаете удаленные ветвления, которые не нужноone
Я нашел вот это:
И он переместил все мои удаленные ветки с korg на rorg (даже без локальных копий веток). См. Вывод ниже:
И затем вы можете сделать то же самое для
tags
ссылок:источник
Everything up-to-date
на git 2.10.0 ничего не происходит, в то время как делает то же самое на отдельных ветках работает.HEAD
. Но это можно удалить.git push rorg :HEAD
git push rorg refs/tags/*:refs/tags/*
. Это то же самоеgit push rorg --tags
, но хорошо понимать, что делают эти штуки :)В дополнение к ответу patthoyt , вот короткий сценарий оболочки, который перемещает все ветви с одного пульта на другой:
Подводя итог, для каждой удаленной ветви на удаленном источнике (исключая ветви-указатели, такие как HEAD), передайте этот ref на удаленный пункт назначения. (
${a//$SRC_REMOTE\/}
Бит удаляет удаленное имя источника из имени ветки, т. Е.origin/master
Становитсяmaster
.)источник
git push -u $DST_REMOTE $(for a in $(git branch --list --remote "$SRC_REMOTE/*" | grep -v --regexp='->'); do echo "$a:refs/heads/${a//$SRC_REMOTE\/}"; done)
Это работает в Zsh
источник
Для любого сценария, который я предлагаю вам запустить, было бы разумно спрятать или зафиксировать все ваши изменения.
Мне нужно было перенести несколько веток с одного пульта на другой. Эти ответы требовали, чтобы местные филиалы существовали ранее.
Просто измените origin1 на исходный пульт, а origin2 на конечный пульт. Скопируйте это в «remoteBranchCloner.sh» и вызовите его, используя «sh callBranchCloner.sh».
Там может быть лучший способ, который не делает несколько нажатий.
Если вы используете мой код, вы, вероятно, захотите использовать кеширование учетных данных, в противном случае вам придется вводить свои учетные данные несколько раз.
Для окон :
Примечание. Этот сценарий предназначен для Linux . Если вы запустите его в «git bash», сценарий будет работать, но вы не сможете запустить его из собственной консоли, не установив что-то особенное.
Для Linux
Где [--global] означает необязательное добавление --global
Если вы хотите установить удаленное отслеживание для всех веток на новый пульт:
Сохранение в виде файла .sh и запуск с "sh filename.sh" установит все восходящие потоки для отслеживания удаленного 'remotename'
источник
Из-за того,
HEAD
что в предыдущем ответе была создана дополнительная ветка , самый чистый способ, который я нашел для этого, - это клонировать в чистый репозиторий, а затем отправить все ветки на удаленный компьютер следующим образом:источник