Przenoszenie zawartości repozytorium Git do innego repozytorium z zachowaniem historii

141

Próbuję przenieść tylko zawartość jednego repozytorium ( repo1) do innego istniejącego repozytorium ( repo2) za pomocą następujących poleceń:

git clone repo1
git clone repo2
cd repo1
git remote rm origin
git remote add repo1
git push

Ale to nie działa. Przejrzałem podobny post, ale znalazłem tylko jeden przenoszący folder, a nie zawartość.

Mario
źródło
Czy chcesz mieć zawartość repo1 jako gałąź na repo2, czy jako część master, aby foldery obu repo współistniały w twoim katalogu roboczym?
Chronial
Chcę go przenieść jako część mistrza.
Mario
4
Ten samouczek jest doskonały! smashingmagazine.com/2014/05/19/…
xpto

Odpowiedzi:

242

Myślę, że polecenia, których szukasz, to:

cd repo2
git checkout master
git remote add r1remote **url-of-repo1**
git fetch r1remote
git merge r1remote/master --allow-unrelated-histories
git remote rm r1remote

Po tym repo2/masterbędzie zawierał wszystko od repo2/masteri repo1/master, a także będzie miał historię obu z nich.

Chronial
źródło
Dzięki Chronial, chcę się tylko upewnić, że repo1 ma również jedną gałąź, a co jeśli chcę przenieść tę gałąź również do repo2?
Mario
cóż, czy repo2 ma również drugą gałąź? Albo co powinno się stać z tą gałęzią?
Chronial
1
Chronial, powyższe komendy nie działały! nie skopiował historii.
Mario
1
OK, teraz zadziałało. Użyłem następującego polecenia; cd repo2,> git remote rm origin> git remote add origin url-of-repo1 ,> git fetch r1remote> git push origin master
Mario
1
@abhijithda Najprostszym rozwiązaniem byłoby przeniesienie wszystkiego wewnątrz repo1do podfolderu (wewnątrz repo1) przed scaleniem.
Chronial
55

Doskonale opisane tutaj https://www.smashingmagazine.com/2014/05/moving-git-repository-new-server/

Najpierw musimy pobrać wszystkie zdalne gałęzie i tagi z istniejącego repozytorium do naszego lokalnego indeksu:

git fetch origin

Możemy sprawdzić brakujące gałęzie, których potrzebujemy, aby utworzyć lokalną kopię:

git branch -a

Użyjmy sklonowanego przez SSH adresu URL naszego nowego repozytorium, aby utworzyć nowy pilot w naszym istniejącym lokalnym repozytorium:

git remote add new-origin [email protected]:manakor/manascope.git

Teraz jesteśmy gotowi do przekazania wszystkich lokalnych gałęzi i tagów do nowego pilota o nazwie new-origin:

git push --all new-origin 
git push --tags new-origin

Uczyńmy new-origin domyślnym pilotem:

git remote rm origin

Zmień nazwę new-origin na just origin, tak aby stał się domyślnym pilotem:

git remote rename new-origin origin
Siergiej Oniszczenko
źródło
4
Potwierdza, że ​​kopiuje to całą historię i tagi. Bardzo dobrze. Dzięki.
Alex
Jeśli nowy początek nie ma żadnego zatwierdzenia, działa dobrze. Jeśli jednak w nowym źródle jest jakieś zatwierdzenie, wspomniany tutaj sposób nie będzie zgodny z oczekiwaniami.
caot
musisz zamienić gałęzie za pomocą, git checkout BranchNamea następnie ponownie wypchnąć gałąź do zdalnego repozytorium za pomocą, git push --all new-origin ale wielkie dzięki
Raad Altaie
21

Jeśli chcesz zachować istniejące gałęzie i historię zatwierdzania, oto jeden ze sposobów, który zadziałał dla mnie.

git clone --mirror https://github.com/account/repo.git cloned-repo
cd cloned-repo
git push --mirror {URL of new (empty) repo}

# at this point only remote cloned-repo is correct, local has auto-generated repo structure with folders such as "branches" or "refs"
cd ..
rm -rf cloned-repo
git clone {URL of new (empty) repo}
# only now will you see the expected user-generated contents in local cloned-repo folder

# note: all non-master branches are avaialable, but git branch will not show them until you git checkout each of them
# to automatically checkout all remote branches use this loop:
for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

Załóżmy teraz, że chcesz zachować synchronizację repozytoriów źródłowych i docelowych przez pewien czas. Na przykład w bieżącym zdalnym repozytorium nadal istnieje aktywność, którą chcesz przenieść do nowego / zastępczego repozytorium.

git clone -o old https://github.com/account/repo.git my-repo
cd my-repo
git remote add new {URL of new repo}

Aby pobrać najnowsze aktualizacje (zakładając, że nie masz żadnych lokalnych zmian):

git checkout {branch(es) of interest}
git pull old
git push --all new

Uwaga: nie korzystałem jeszcze z modułów podrzędnych, więc nie wiem, jakie dodatkowe kroki mogą być wymagane, jeśli je masz.

Dan Cohn
źródło
1
To działało dla mnie prosto i łatwo. Myślę, że to powinna być sprawdzona odpowiedź. Jeśli masz 60 oddziałów, to jest droga.
rickfoosusa
7

Najprostsze podejście, jeśli kod jest już śledzony przez Git, ustaw nowe repozytorium jako „źródło” do wypchnięcia.

cd existing-project
git remote set-url origin https://clone-url.git
git push -u origin --all
git push origin --tags
Jaskółka oknówka
źródło
6

To zadziałało, aby przenieść moje lokalne repozytorium (w tym historię) do mojego zdalnego repozytorium github.com. Po utworzeniu nowego pustego repozytorium na GitHub.com używam adresu URL w kroku trzecim poniżej i działa świetnie.

git clone --mirror <url_of_old_repo>
cd <name_of_old_repo>
git remote add new-origin <url_of_new_repo>
git push new-origin --mirror

Znalazłem to na: https://gist.github.com/niksumeiko/8972566

raddevus
źródło
1
To najłatwiejszy sposób na udostępnienie oryginalnego repozytorium. Kopiuje również wszystkie gałęzie.
Guillermo,
1
Spowoduje to również skopiowanie wszystkich tagów.
kruk
2

Użyłem poniższej metody do migracji mojego GIT Stash do GitLab, zachowując wszystkie gałęzie i historię zatwierdzeń.

Sklonuj stare repozytorium do lokalnego.

git clone --bare <STASH-URL>

Utwórz puste repozytorium w GitLab.

git push --mirror <GitLab-URL>
Roopkumar Akubathini
źródło
1

Wygląda na to, że jesteś blisko. Zakładając, że to nie tylko literówka w przesłanym zgłoszeniu, krok 3 powinien być cd repo2zamiast repo1. A krok 6 nie powinien być git pullpopychany. Przerobiona lista:

1. git clone repo1
2. git clone repo2
3. cd repo2
4. git remote rm origin
5. git remote add repo1
6. git pull
7. git remote rm repo1
8. git remote add newremote
Eric Palace
źródło
Dzięki Eric, ale w kroku 3 chcę usunąć łącze do oryginalnego repozytorium, aby uniknąć dokonywania jakichkolwiek zdalnych zmian ... ponieważ chcę przenieść zawartość z repo1 do repo2.
Mario
W porządku. Zredagowałem odpowiedź, aby to odzwierciedlić. Aby się upewnić, próbujesz utworzyć repozytorium, repo2, czyli kopię repo1, ale nie przechowuje repo1 ani źródła jako pilotów?
Eric Palace
Nie, nie próbuję tworzyć nowego repozytorium „repo2”. Właściwie mam istniejące repo2, które mają inną zawartość init. Teraz chcę przenieść całą zawartość repo1 do repo2 z historią. Pozostawię repo1 puste, tak jak jest na serwerze.
Mario
Czy rozważałeś nie używanie git? Wygląda na to, że prawdopodobnie możesz po prostu skopiować pliki (przez gui, scp lub ftp) i ręcznie dodać je do repozytorium git. Może nie być tak wydajne, ale prawdopodobnie prostsze.
Eric Palace
Już próbowałem, ale opuściło to historię. Chcę też przenieść całą jego historię.
Mario,
1

Zgodnie z odpowiedzią @ Dan-Cohn Mirror-push jest tutaj twoim przyjacielem. To jest moja droga do migracji repozytoriów:

Tworzenie kopii lustrzanych repozytorium

1.Otwórz Git Bash.

2.Utwórz czysty klon repozytorium.

$ git clone --bare https://github.com/exampleuser/old-repository.git

3.Mirror-push do nowego repozytorium.

$ cd old-repository.git
$ git push --mirror https://github.com/exampleuser/new-repository.git

4. Usuń tymczasowe repozytorium lokalne utworzone w kroku 1.

$ cd ..
$ rm -rf old-repository.git

Źródła i kredyt: https://help.github.com/en/articles/duplicating-a-repository

DalSoft
źródło
-1

Tutaj jest wiele skomplikowanych odpowiedzi; jeśli jednak nie jesteś zainteresowany zachowaniem gałęzi, wszystko, co musisz zrobić, to zresetować zdalne źródło, ustawić wysyłanie i wypchnąć.

To działało, aby zachować dla mnie całą historię zatwierdzeń.

cd <location of local repo.>
git remote set-url origin <url>
git push -u origin master
Tomasz
źródło