Mam lokalne repozytorium Git, które chciałbym przekazać do nowego zdalnego repozytorium (zupełnie nowe repozytorium skonfigurowane na Beanstalk, jeśli to ma znaczenie).
Moje lokalne repozytorium ma kilka gałęzi i tagów i chciałbym zachować całą moją historię.
Wygląda na to, że po prostu muszę to zrobić git push
, ale to tylko przesyła master
gałąź.
Jak wypchnąć wszystko, aby uzyskać pełną replikę mojego lokalnego repozytorium na pilocie?
Odpowiedzi:
Aby wypchnąć wszystkie gałęzie , użyj jednego z nich (zamień REMOTE na nazwę pilota, na przykład „origin”):
Aby wypchnąć wszystkie tagi :
Wreszcie myślę, że możesz to wszystko zrobić za pomocą jednego polecenia za pomocą:
Jednak dodatkowo
--mirror
popchnie również piloty, więc może nie być to dokładnie to, czego chcesz.źródło
--all
zamiast*:*
wydaje się bardziej przyjaznygit push REMOTE --all
powrócił,No refs in common and none specified;
nie robiąc nic., Podczas gdy wgit push REMOTE "*:*
rzeczywistości zepchnął wszystkie gałęzie na odległość.git clone --mirror old-remote-url; cd repo.git; git push --mirror new-remote-url
.W przypadku takim jak ja, że nabyłeś repozytorium i teraz przełączasz zdalne pochodzenie na inne repo, nowe puste ...
Masz więc repozytorium i wszystkie gałęzie w środku, ale nadal musisz sprawdzić te gałęzie, aby
git push --all
polecenie również je wypchnęło.Powinieneś to zrobić przed pchnięciem:
Śledzony przez
źródło
git push '*:*'
pchnął wszystkie gałęzie.git push -all
właśnie popchnął mistrza. Transportowałem repozytorium z github do bitbucket.--track remotes/$remote
zamiast--track $remote
. Oto pełna linia poleceń:for remote in `git branch -r | grep -v master `; do git checkout --track remotes/$remote ; done
Oto kolejne spojrzenie na to samo, które działało lepiej w sytuacji, w której byłem. Rozwiązuje problem, w którym masz więcej niż jednego pilota, chciałbyś sklonować wszystkie gałęzie z pilota
source
do pilotadestination
ale bez konieczności wcześniejszego sprawdzania ich wszystkich.(Problem, który miałem z rozwiązaniem Daniela, polegał na tym, że odmówiłby wyewidencjonowania oddziału śledzenia ze
source
zdalnego, jeśli już go wcześniej sprawdziłem, tj. Nie zaktualizowałby mojego lokalnego oddziału przed wypchnięciem)spowoduje to popchnięcie wszystkich gałęzi na odległość
source
do gałęzi głównejdestination
, prawdopodobnie wykonując push nie do przodu. Nadal musisz przesuwać tagi osobno.źródło
remote
do drugiego. Dzięki!git push destination +refs/remotes/source/\*:refs/heads/\*
--prune
opcji.--mirror
parametr, który wszyscy zalecają. Działa idealnie w scenariuszach, w których chcesz synchronizować dwa piloty do celów automatyzacji lub kontroli.To najbardziej zwięzły sposób, jaki znalazłem, pod warunkiem, że miejsce docelowe jest puste. Przejdź do pustego folderu, a następnie:
W razie
https://...
potrzeby zamień nafile:///your/repo
itp.źródło
Strona man
git-push
jest warta przeczytania. W połączeniu z tą witryną napisałem w moim.git/config
:Te
push = :
środki „push żadnych oddziałów«dopasowywania»(tj gałęzie, które już istnieją w zdalnym repozytorium i mieć lokalny odpowiednik)”, natomiastpush = refs/tags/*
środki „push wszystkie znaczniki”.Więc teraz muszę tylko uruchomić,
git push
aby wypchnąć wszystkie pasujące gałęzie i wszystkie tagi.Tak, nie jest to dokładnie to, czego chciał OP (wszystkie odgałęzienia do wypychania muszą już istnieć po drugiej stronie), ale mogą być pomocne dla tych, którzy znajdą to pytanie podczas szukania w Google „jak wypychać gałęzie i znaczniki jednocześnie czas".
źródło
W moim przypadku zadziałało.
źródło
origin
jest aliasem zdalnego repozytorium Git adresu URL.Kopia lustrzana repozytorium
Utwórz czysty klon repozytorium.
Odbicie lustrzane do nowego repozytorium.
Usuń tymczasowe lokalne repozytorium utworzone w kroku 1.
Odbicie lustrzane repozytorium zawierającego obiekty Git Large File Storage
Utwórz czysty klon repozytorium. Zastąp przykładową nazwę użytkownika nazwą osoby lub organizacji, która jest właścicielem repozytorium, i zastąp przykładową nazwę repozytorium nazwą repozytorium, które chcesz powielić.
Przejdź do sklonowanego właśnie repozytorium.
Pobierz obiekty Git Large File Storage repozytorium.
Odbicie lustrzane do nowego repozytorium.
Wepchnij obiekty Git Large File Storage repozytorium do swojego lustra.
Usuń tymczasowe lokalne repozytorium utworzone w kroku 1.
Powyższa instrukcja pochodzi z Pomocy Github: https://help.github.com/articles/duplicating-a-repository/
źródło
Znalazłem powyższe odpowiedzi wciąż zawierają pewne niejasne rzeczy, które wprowadzą użytkowników w błąd. Po pierwsze, to pewne
git push new_origin --all
igit push new_origin --mirror
nie może powielić wszystkich gałęzi pochodzenia, po prostu powielił istniejące gałęzie lokalne do nowego_orygina.Poniżej znajdują się dwie przydatne metody, które przetestowałem:
1, zduplikowane przez klon nagie repo.
git clone --bare origin_url
, a następnie wejdź do folderu i.git push new_origin_url --mirror
W ten sposób możesz również korzystać zgit clone --mirror origin_url
obu tych funkcji--bare
i--mirror
pobierać nagie repozytorium, nie uwzględniając obszaru roboczego. proszę odnieść się do tego2, jeśli masz repozytorium git za pomocą
git clone
, co oznacza, że masz nagie repozytorium i git obszar roboczy, możesz użyćgit remote add new_origin new_origin_url
, a następniegit push new_origin +refs/remotes/origin/\*:refs/heads/\*
, a następniegit push new_origin --tags
W ten sposób otrzymasz dodatkową gałąź głowy, co nie ma sensu.
źródło
Aby wypychać gałęzie i tagi (ale nie piloty):
Byłoby to równoznaczne z łączeniem opcji
--tags
i--all
dlagit push
, na które git nie pozwala.źródło
+refs/remotes/source/*
Na podstawie odpowiedzi @Daniel zrobiłem:
źródło
| grep -v master
można go zastąpić| sed 's/\*//'
(Zakładam, że zostałeś wykluczony,master
aby uniknąć nieprzyjemnych*
rzeczy, które są dołączone do aktualnie wybranej gałęzi), co pozwala ci uwzględnićmaster
i uniknąć problemów, gdymaster
nie jest to aktualnie wybrana gałąź. Przepraszam również za nekropostę, po prostu ta odpowiedź pomogła mi dzisiaj i chciałem podzielić się moją modyfikacją, jeśli może pomóc innym na moim stanowisku ...Odkryłem, że żadne z nich nie działało poprawnie dla mnie. Zapraszam do wypalenia tego na śmierć, ale z jakiegoś powodu inne opcje nie mogły działać poprawnie.
Oczekiwanym rezultatem było „sklonowanie” repozytorium do innego pilota (tj. Z Github do innego dostawcy):
Głównym problemem, który widziałem, było to, że wszystkie odległe gałęzie nie zostały odtworzone w nowym pilocie. Jeśli polecenie tak, nowy pilot nie ma historii rozgałęzienia (tzn. Wykonuje polecenie
git checkout branch; git log
nie pokazywałoby oczekiwanych zatwierdzeń gałęzi).Zauważyłem, że
git checkout -b branchname
NIE jest to samo cogit checkout branchname
(to drugie jest tym, czego potrzebowałem). Zauważyłemgit checkout --track branchname
że nie zmieniłem historii oddziału.Moje rozwiązanie (oparte na PowerShell):
źródło
Poniższe polecenie popchnie wszystkie gałęzie (w tym te, których nigdy nie wymeldowałeś, ale są obecne w repozytorium git, możesz je zobaczyć według
git branch -a
)git push origin '*:*'
źródło
Byłem w trakcie przechodzenia z jednej usługi kontroli wersji do drugiej i musiałem sklonować wszystkie repozytoria, w tym wszystkie gałęzie, tagi i historię.
Aby osiągnąć powyższe, zrobiłem następnie:
git push origin '*:*'
Skrypt .sh służący do pobrania wszystkich gałęzi do lokalnego repozytorium:
źródło