Git push гілка з одного віддаленого на інший?


133

У мене встановлені такі пульти:

$ 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пульта дистанційного керування. Як це зробити?

Переважно, не роблячи локальної гілки для кожного першого, якщо цього можна уникнути.


Я здогадуюсь, відповідь на цю можна порівняти з відповіддю на цю: stackoverflow.com/questions/6922700/… .
Леголас

Відповіді:


52

Швидкий тест із створення тимчасових сховищ показує, що ви можете побудувати респект, який може це зробити:

$ 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

Тож походження / BRANCHNAME: refs / heads / BRANCHNAME

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

pat@host /tmp/rorg (BARE:master)
$ git graph --all
* 5750bca (HEAD, master) c
| * 13fd55a (one) b
|/
* 822e0de a

5
Чому б не git push rorg origin/one:one(без refs/heads/) натомість?
Алі

2
@exalted тому, що за допомогою refs/heads/префікса ви натискаєте віддалене розгалуження, яке не потрібно one
перевіряти

@patthoyts Я спробував згадану команду, в ній написано все, але у мене є 10 гілок на віддаленому A і 6 гілок у віддаленому B, тож скажіть, будь ласка, як я можу перемістити ліві гілки?
Кешав1234

219

Я знайшов це:

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/*'

2
У новій досить (в якій версії?) Git, це має бути прийнятою відповіддю. @ bjarke-freund-hansen Ви хочете змінити прийняту відповідь, якщо ви погоджуєтесь на користь майбутніх шукачів?
Jonah Graham

1
"У достатній новій (на якій версії?) Git, це має бути прийнятою відповіддю", як я знаю, це повинно працювати для кожної публічної версії git, тому що ці
подвійні

3
Дає мені Everything up-to-dateна git 2.10.0, але нічого не відбувається, виконуючи те ж саме на окремих галузях.
user239558

6
Я просто подумав, що я повинен викликати це: цей метод, здається, створює фактичну гілку на віддаленому виклику HEAD. Але це можна видалити. git push rorg :HEAD
Марк Стіклі

1
Будь-не знайомі зі структурою і REFS цікаво , як розсунути теги, Ви хочете цю команду: git push rorg refs/tags/*:refs/tags/*. Що таке саме git push rorg --tags, але добре зрозуміти, що роблять ці речі :)
Марк Стіклі

14

Щоб доповнити відповідь Патхойта , ось короткий скрипт оболонки, який переміщує всі гілки з одного віддаленого в інше:

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


3
для тих із нас, кому це потрібно зробити одним поштовхом: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)
Jayen


0

Для будь-якого сценарію, який я пропоную вам запустити, було б розумно зберігати або вносити всі свої зміни.

Мені потрібно було просунути кілька гілок від одного віддаленого до іншого. Ці відповіді вимагали, щоб місцеві відділення існували раніше

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", встановить всі upstreams для відстеження віддаленого "remotename"


0

Через те, що додаткова HEADгілка була створена в попередній відповіді , найчистіший спосіб, який я знайшов це зробити, - це клонуватись у голому сховищі, а потім пересувати всі гілки до віддаленого, як слід:

git clone --bare <from-repository>
cd <from-repo-dir>
git push --set-upstream <to-repository> --all
git push --set-upstream <to-repository> --tags
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.