Git push branch z jednego pilota do drugiego?

Mam ustawione następujące piloty:

$ git remote 
korg
rorg

Oraz następujące gałęzie:

$ 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

Teraz chcę wypchnąć wszystkie zdalne gałęzie z korg do rorg zdalnego. Jak mam to zrobić?

Najlepiej bez tworzenia lokalnego oddziału dla każdego pierwszego, jeśli można tego uniknąć.

Author: hjpotter92, 2011-10-19

5 answers

Szybki test tworzenia tymczasowych repozytoriów pokazuje, że możesz skonstruować refspec, który może to zrobić:

$ 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

So origin/BRANCHNAME: refs/heads / BRANCHNAME

Sprawdzanie w moim rorg pilocie:

pat@host /tmp/rorg (BARE:master)
$ git graph --all
* 5750bca (HEAD, master) c
| * 13fd55a (one) b
|/
* 822e0de a
 37
Author: patthoyts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-19 09:33:15

Znalazłem ten:

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

I wypchnął wszystkie moje odległe gałęzie z korg do rorg (nawet bez lokalnych kopii gałęzi). Zobacz wynik poniżej:

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

I wtedy możesz zrobić to samo dla tags refs:

git push rorg 'refs/tags/*:refs/tags/*'
 167
Author: radistao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-01 19:54:49

Aby uzupełnić odpowiedź patthoyta , Oto krótki skrypt powłoki, który przepycha wszystkie gałęzie z jednego pilota do drugiego:

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

Podsumowując, dla każdej zdalnej gałęzi na zdalnym źródłowym (z wyjątkiem gałęzi "pointer", takich jak HEAD), naciśnij ten ref do zdalnego docelowego. (Bit ${a//$SRC_REMOTE\/} usuwa zdalną nazwę źródłową z nazwy gałęzi, tzn. origin/master staje się master.)

 13
Author: blahdiblah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:33:25

To działa w Zsh

git push rorg 'refs/remotes/korg/*:refs/heads/*'
 4
Author: Dongfang Zhu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-04 01:11:51

Dla każdego skryptu, który sugeruję Ci uruchomić, mądrze byłoby ukryć lub zatwierdzić wszystkie zmiany.

Musiałem przepchnąć kilka gałęzi z jednego pilota do drugiego. Odpowiedzi te wymagały, że lokalne oddziały istniały wcześniej
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

Po prostu zmień origin1 na zdalny źródłowy, a origin2 na zdalny docelowy. Skopiuj to do "remoteBranchCloner.sh" i nazwij to używając "sh callBranchCloner.sh".

Może być lepszy sposób, który nie Kilka pchnięć.

Jeśli używasz mojego kodu, prawdopodobnie chcesz użyć cachowania poświadczeń, w przeciwnym razie musisz wpisać swoje poświadczenia serveral times.

Dla windows :

Uwaga: Ten skrypt jest dla Linuksa . Jeśli uruchomisz go w "Git bash" skrypt będzie działał, ale nie możesz go uruchomić z natywnej konsoli bez zainstalowania czegoś specjalnego.

git config [--global] credential.helper wincred

Dla Linuksa

git config [--global] credential.helper cache

Gdzie [--global] oznacza opcjonalnie add --global

Jeśli chcesz ustawić zdalne śledzenie wszystkich gałęzi na nowy:

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

Zapisany jako plik. sh i uruchomiony z "sh filename.sh" ustawia wszystkie upstreams do śledzenia zdalnego 'remotename'

 0
Author: csga5000,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-22 19:42:35