Git push ветку от одного пульта к другому? - PullRequest
110 голосов
/ 19 октября 2011

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

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

Желательно без создания локальной ветки для каждого первого, если этого можно избежать.

Ответы [ 6 ]

195 голосов
/ 15 января 2014

Я нашел это:

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/*'
42 голосов
/ 19 октября 2011

Быстрый тест, выполняющий некоторые временные репозитории, показывает, что вы можете создать 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 пульт:

pat@host /tmp/rorg (BARE:master)
$ git graph --all
* 5750bca (HEAD, master) c
| * 13fd55a (one) b
|/
* 822e0de a
13 голосов
/ 19 апреля 2013

В дополнение к ответу Паттоита , вот короткий сценарий оболочки, который перемещает все ветви с одного пульта на другой:

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 голосов
/ 04 августа 2017

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

git push rorg 'refs/remotes/korg/*:refs/heads/*'
0 голосов
/ 09 мая 2019

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

git clone --bare <from-repository>
cd <from-repo-dir>
git push --set-upstream <to-repository> --all
git push --set-upstream <to-repository> --tags
0 голосов
/ 22 июля 2015

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

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

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».

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

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

Для окон :

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

git config [--global] credential.helper wincred

Дляlinux

git config [--global] credential.helper cache

Где [--global] означает опционально добавить --global

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

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

Хранится в виде файла .sh и запускается с "sh filename.sh", чтобы все вышестоящие потоки отслеживали удаленное 'remotename'

...