Mam skonfigurowane 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 mogę to zrobić?
Najlepiej bez tworzenia lokalnego oddziału dla każdego w pierwszej kolejności, jeśli można tego uniknąć.
git
git-branch
git-push
git-remote
Bjarke Freund-Hansen
źródło
źródło
Odpowiedzi:
Szybki test tworzący tymczasowe repozytoria pokazuje, że możesz zbudować refspec, który może to zrobić:
Więc origin / BRANCHNAME: refs / heads / BRANCHNAME
Sprawdzanie w moim
rorg
pilocie:źródło
git push rorg origin/one:one
(bezrefs/heads/
) zamiast tego?refs/heads/
prefiksem pchasz zdalne rozgałęzienie, które nie musi być wyewidencjonowane doone
Znalazłem ten:
I wypchnął wszystkie moje zdalne oddziały z korg do rorg (nawet bez lokalnych kopii oddziałów). Zobacz dane wyjściowe poniżej:
A potem możesz zrobić ten sam nacisk na
tags
referencje:źródło
Everything up-to-date
git 2.10.0 i nic się nie dzieje, podczas gdy robienie tego samego na poszczególnych gałęziach działa.HEAD
. Ale to można usunąć.git push rorg :HEAD
git push rorg refs/tags/*:refs/tags/*
. To jest to samo cogit push rorg --tags
, ale dobrze jest zrozumieć, co te rzeczy robią :)Aby uzupełnić odpowiedź patthoyta , oto krótki skrypt powłoki, który przesuwa wszystkie gałęzie z jednego pilota do drugiego:
Podsumowując, dla każdej zdalnej gałęzi na zdalnym źródle (z wyłączeniem gałęzi „wskaźnikowych”, takich jak HEAD), wypchnij to odniesienie do zdalnego pilota docelowego. (
${a//$SRC_REMOTE\/}
Bit usuwa zdalną nazwę źródła z nazwy gałęzi, tj .origin/master
Staje sięmaster
.)źródło
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)
Działa to w Zsh
Zauważ, że pojedynczy cudzysłów jest niezbędny, aby zapobiec nieoczekiwanej ekspansji parametrów w niektórych przypadkach.
źródło
Dla każdego skryptu, który sugeruję, abyś uruchomił, dobrze byłoby ukryć lub zatwierdzić wszystkie zmiany.
Musiałem przesunąć kilka gałęzi z jednego pilota do drugiego. Te odpowiedzi wymagały wcześniejszego istnienia lokalnych oddziałów
Po prostu zmień origin1 na pilota źródłowego, a origin2 na pilota docelowego. Skopiuj to do „remoteBranchCloner.sh” i wywołaj za pomocą „sh callBranchCloner.sh”.
Może być lepszy sposób, ale to nie wystarczy powoduje kilku pchnięć.
Jeśli używasz mojego kodu, prawdopodobnie chcesz użyć buforowania poświadczeń, przeciwnym razie będziesz musiał wpisywać swoje poświadczenia kilka razy.
Dla Windowsa :
Uwaga: ten skrypt jest przeznaczony dla systemu Linux . Jeśli uruchomisz go w "git bash", skrypt zadziała, ale nie możesz go uruchomić z natywnej konsoli bez zainstalowania czegoś specjalnego.
W przypadku systemu Linux
Gdzie [--global] oznacza opcjonalne dodanie --global
Jeśli chcesz ustawić zdalne śledzenie dla wszystkich oddziałów na nowego pilota:
Przechowywany jako plik .sh i uruchamiany z „sh nazwa_pliku.sh” ustawia wszystkie nadrzędne strumienie na śledzenie zdalnego „nazwy zdalnego”
źródło
Ze względu na utworzenie dodatkowej
HEAD
gałęzi w poprzedniej odpowiedzi najczystszym sposobem, jaki znalazłem, jest sklonowanie do czystego repozytorium, a następnie wypchnięcie wszystkich gałęzi do pilota w następujący sposób:git clone --bare <from-repository> cd <from-repo-dir> git push --set-upstream <to-repository> --all git push --set-upstream <to-repository> --tags
źródło