Git нажмите ветку с одного пульта на другой?

У меня установлены следующие пульты:

$ 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. Как это сделать?

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

Ответ 1

Быстрый тест, создающий некоторые временные репозитории, показывает, что вы можете создать refspec, который может это сделать:

$ git push rorg origin/one:refs/heads/one
Counting objects: 5, done.
Writing objects: 100% (3/3), 240 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /tmp/rorg
 * [new branch]      origin/one -> one

Итак, origin/BRANCHNAME: refs/heads/BRANCHNAME

Проверка моего пульта rorg:

[email protected] /tmp/rorg (BARE:master)
$ git graph --all
* 5750bca (HEAD, master) c
| * 13fd55a (one) b
|/
* 822e0de a

Ответ 2

Я нашел это:

git push rorg 'refs/remotes/korg/*:refs/heads/*'

И это подтолкнуло все мои удаленные ветки из korg в rorg (даже без локальных копий веток). Смотрите вывод ниже:

Counting objects: 293, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (67/67), done.
Writing objects: 100% (176/176), 48.32 KiB, done.
Total 176 (delta 105), reused 168 (delta 97)
remote: Resolving deltas:  11% (12/105)
To <<MY_REPOSITORY_URL>>
 * [new branch]      korg/gingerbread-> gingerbread
 * [new branch]      korg/gingerbread-release -> gingerbread-release
 * [new branch]      korg/honeycomb-> honeycomb
 * [new branch]      korg/HEAD -> HEAD
 * [new branch]      korg/honeycomb-mr1-release-> honeycomb-mr1-release
 * [new branch]      korg/master -> master

И тогда вы можете сделать тот же толчок для tags ссылок:

git push rorg 'refs/tags/*:refs/tags/*'

Ответ 3

Чтобы дополнить patthoyt answer, здесь короткая оболочка script, которая толкает все ветки с одного пульта на другой:

SRC_REMOTE=korg
DST_REMOTE=rorg
for a in $(git branch --list --remote "$SRC_REMOTE/*" | grep -v --regexp='->')
  do git push "$DST_REMOTE" "$a:refs/heads/${a//$SRC_REMOTE\/}"
done

Подводя итог, для каждой удаленной ветки на удаленном источнике (исключая ветки "указатель", например HEAD), нажмите эту ссылку на удаленный пункт назначения. (Бит ${a//$SRC_REMOTE\/} разбивает исходное имя удаленного устройства на имя ветки, т.е. origin/master становится master.)

Ответ 4

Это работает в Zsh

git push rorg 'refs/remotes/korg/*:refs/heads/*'

Ответ 5

Для любого script Я предлагаю вам запустить, было бы разумно спрятать или зафиксировать все ваши изменения.

Мне нужно было нажать несколько ветвей с одного пульта на другой. Эти ответы требовали, чтобы локальные ветки ранее существовали

SRC_R=origin1
DEST_R=origin2
for cbranch in $(git branch -r | grep $SRC_R | cut -d '/' -f2,3,4,5 | cut -d ' ' -f1)
do
    git checkout $cbranch
    git push $DEST_R $cbranch
done

Просто измените origin1 на исходный пульт, а origin2 - на удаленный пункт назначения. Скопируйте его в "remoteBranchCloner.sh" и вызовите его, используя "sh callBranchCloner.sh".

Может быть способ лучше, который не выполняет несколько нажатий.

Если вы используете мой код, вы, вероятно, захотите использовать кэширование учетных данных,, иначе вам придется вводить серверные данные учетных данных.

Для окон:

Примечание: Этот script предназначен для linux. Если вы запустите его в git bash ", script будет работать, но вы не сможете запустить его с родной консоли, не установив что-то особенное.

git config [--global] credential.helper wincred

Для linux

git config [--global] credential.helper cache

Где [--global] означает необязательный add -global

Если вы хотите настроить дистанционное отслеживание всех ветвей на новый пульт:

DEST_R=remotename
for cbranch in `git branch`
do
    git checkout $cbranch
    git branch -u guru/$cbranch
done

Сохраненный как .sh файл и запускаемый с помощью "sh filename.sh", установит все восходящие потоки для отслеживания удаленного "remotename"

Ответ 6

Из-за того, что в предыдущем ответе была создана дополнительная ветка HEAD я обнаружил, что самый чистый способ сделать это - клонировать в пустой репозиторий, а затем передать все ветки на удаленный компьютер следующим образом:

git clone --bare <from-repository>
cd <from-repo-dir>
git push --set-upstream <to-repository> --all
git push --set-upstream <to-repository> --tags