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