Jak przeprowadzić migrację repozytorium GIT z jednego serwera na nowy


263

Mam serwer, który usuwam. Do migracji pozostało mi tylko moje repozytorium. Ten serwer jest wymieniony jako źródło (master) dla jednego z moich projektów. Jaki jest właściwy sposób przeniesienia repozytorium w celu zachowania historii.


Wszystkie informacje (repozytorium, pień itp.) O repozytorium są przechowywane w folderze o nazwie „.git”, w którym inicjujesz repozytorium. Musisz więc skopiować zawartość na nowy serwer, korzystając z instrukcji podanych tutaj
Mansab Uppal 24.01.2013

1
po prostu git config remote.origin.url newurl patrz stackoverflow.com/questions/3011402/…
Niels

1
Jeśli chcesz migrować swoje repozytorium, a wszystkie gałęzie używają odpowiedzi jzwiener lub Roberto zamiast odpowiedzi zaakceptowanej.
jonaglon

Odpowiedzi:


246

Aby dodać nową lokalizację repozytorium,

git remote add new_repo_name new_repo_url

Następnie wypchnij zawartość do nowej lokalizacji

git push new_repo_name master

Na koniec usuń stary

git remote rm origin

Następnie możesz zrobić to, co powiedział bdonlan i edytować plik.git / config, aby zmienić new_repo_name na origin. Jeśli nie usuniesz źródła (oryginalne zdalne repozytorium), możesz po prostu wcisnąć zmiany do nowego repozytorium za pomocą

git push new_repo_name master

8
Czy to skopiowałoby tylko jedną gałąź ze starego repozytorium do nowego?
Andrew Grimm

34
Jakie jest rozwiązanie migracji wszystkich gałęzi?
emmby

49
Powinieneś być w stanie przepchnąć wszystkie gałęzie jednocześnie git push -u new_repo_name --all.
rmarscher

10
Migrację wszystkich oddziałów można znaleźć na stackoverflow.com/a/18336145/923599
jzwiener

10
Zamiast edytować plik git-config, to polecenie działało dla mnie:git remote rename new_repo_name origin
Salim,

210

Jeśli chcesz migrować wszystkie gałęzie i tagi, powinieneś użyć następujących poleceń:

git clone --mirror [oldUrl]

sklonować stare repozytorium ze wszystkimi gałęziami

cd the_repo
git remote add remoteName newRepoUrl

skonfigurować nowego pilota

git push -f --tags remoteName refs/heads/*:refs/heads/*

wcisnąć wszystkie referencje pod referencje / głowy (prawdopodobnie tego właśnie chcesz)


5
Git narzekał na to --tagsi refs/heads/*:refs/heads/*nie jest z nimi zgodny --mirror. stackoverflow.com/a/26552740/1484831 działał dobrze.
Avigit

3
Użyłem tego i zadziałało to dla mnie. Prawdopodobnie powinna być wybrana odpowiedź. Zauważ, że „kod”, który otrzymujesz lokalnie, wydaje się być ciężki dla metadanych, co sprawia, że ​​dla początkujących nie jest jasne, czy coś poszło nie tak.
nick

3
To powinna być zatwierdzona odpowiedź. Znacznie lepsze niż inne rozwiązania
Travis Griggs

15
Skończyło się ze wszystkich oddziałów na moim nowym zdalnym repozytorium poprzedzone refs/heads/refs/headsużyciem git push -f --tags remoteName refs/heads/*:refs/heads/*więc mam zamienione nagit push remoteName --mirror
dumbledad

1
pushobsługuje również --mirror. git clone --mirror; cd repo; git push --mirror new_remotepowinien załatwić
sprawę

143

To działało dla mnie bezbłędnie .

git clone --mirror <URL to my OLD repo location>
cd <New directory where your OLD repo was cloned>
git remote set-url origin <URL to my NEW repo location>
git push -f origin

Muszę jednak wspomnieć, że tworzy to lustro bieżącego repozytorium, a następnie wypycha je do nowej lokalizacji. Dlatego może to zająć trochę czasu w przypadku dużych repozytoriów lub wolnych połączeń .


15
*** Ten ***
Paul Lockwood

1
Jest to dobre rozwiązanie git zdalny początek adresu URL <URL mojej nowej lokalizacji repozytorium> (po zsynchronizowaniu starego źródła z nowym serwerem / lokalizacją)
Toni Homedes i Saun

2
Ten świetnie się zachowuje. Bez mylących wielu pilotów
TaoPR,

16
Wolę git push --mirror originponad -f.
Aidiakapi

78

Skopiuj to. To naprawdę takie proste. :)

Po stronie klienta po prostu edytuj .git / config w lokalnym repozytorium klienta, aby w razie potrzeby skierować piloty na nowy adres URL.


6
Możesz także po prostu sklonować. Ponadto zamiast bezpośredniej edycji pliku .git / config możesz użyć git rm origin; git remote add origin <nowe repozytorium>.
ebneter

4
rming pilota utraci dowolną konfigurację w tej sekcji konfiguracji - i klonowanie go bez podejmowania dodatkowych kroków spowoduje utratę gałęzi innych niż pień. Można poradzić sobie z tymi problemami, ale tak naprawdę - po prostu zsynchronizuj je.
bdonlan

1
Jakie jest rozwiązanie wykorzystujące do pracy tylko git? rsync wymaga dodatkowych obręczy administracyjnych, przez które trudno jest przejść
emmby

2
pozwala to również zachować np. haczyki i inną konfigurację, więc wolę to od czystych rozwiązań git
mnagel 18.10.13

65

Odbywa się to częściowo w niektórych innych odpowiedziach.

git clone --mirror git@oldserver:oldproject.git
cd oldproject.git
git remote add new git@newserver:newproject.git
git push --mirror new

6
Jest to w rzeczywistości najbardziej kompletna, prosta odpowiedź.
Lawrence Dol

3
--mirrorw push jest bardzo ważne: to powinna być poprawna odpowiedź
PaoloC

Po zainicjowaniu nowego repozytorium na nowym serwerze pamiętaj, aby wykonać goły init, w przeciwnym razie wypychanie nie powiedzie się:git init --bare
marco

35

Po prostu odkładam to, co powiedzieli inni, na prostej liście instrukcji.

  1. Przenieś repozytorium: Zaloguj się do nowego serwera, cddo katalogu nadrzędnego, w którym chcesz teraz przechowywać repozytorium, i użyj rsyncdo skopiowania ze starego serwera:

    new.server> rsync -a -v -e ssh user@old.server.com:path/to/repository.git .
    
  2. Spraw, aby klienci wskazywali nowe repozytorium: Teraz na każdym kliencie korzystającym z repozytorium wystarczy usunąć wskaźnik do starego źródła i dodać jeden do nowego.

    client> git remote rm origin
    client> git remote add origin user@new.server.com:path/to/repository.git
    

Prosty i skuteczny. Możesz dodać flagę --bwlimit = XXX, jeśli chcesz ograniczyć ruch między serwerami, gdzie XXX równa się przepustowości w kilobajtach na sekundę.
Greg Glockner

7
Nieco lepiej niż usuń i dodaj:git remote set-url origin user@new.server.com:path/to/repository.git
Chris KL

Dla tych, którzy wdrażają się na serwerze za pomocą git + capistrano, zauważ, że musiałem używać źródła set-url w 2 miejscach: na localhost i na kopii w pamięci podręcznej, która znajduje się na serwerze.
anandvc


10

Postępowałem zgodnie z instrukcjami na BitBucket, aby przenieść repo ze wszystkimi jego oddziałami. Oto kroki z objaśnieniami po #znaku:

cd path/to/local/repo
git remote remove origin # to get rid of the old setting, this was not in the BitBucket instructions
git remote add origin ssh://git@bitbucket.org/<username>/<newrepo> # modify URL as needed
git push -u origin --all # pushes _ALL_ branches in one go
git push -u origin --tags # pushes _ALL_ tags in one go

Pracował dla mnie ładnie.


8

Postępuj zgodnie z instrukcjami:

  • git zdalnie dodaj nowe pochodzenie
  • git push - wszystkie nowe źródła
  • git push --tags new-origin
  • git zdalne pochodzenie rm
  • git zdalna zmiana nazwy źródła nowego pochodzenia

5

Jest to odmiana tej odpowiedzi , obecnie sugerowana przez gitlab do „migracji” repozytorium git z jednego serwera na drugi.

  1. Załóżmy, że twój stary projekt nazywa się existing_repoi jest przechowywany w existing_repofolderze.

  2. Utwórz repo na nowym serwerze. Zakładamy, że adres URL nowego projektu togit@newserver:newproject.git

  3. Otwórz interfejs wiersza polecenia i wprowadź następujące dane:

    cd existing_repo
    git remote rename origin old-origin
    git remote add origin git@newserver:newproject.git
    git push -u origin --all
    git push -u origin --tags
    

Zaletą tego podejścia jest to, że nie usuwasz gałęzi, która odpowiada twojemu staremu serwerowi.


4

Możesz użyć następującego polecenia:

git remote set-url --push origin new_repo_url

Przykład z http://gitref.org/remotes/

$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
origin  git://github.com/github/git-reference.git (fetch)
origin  git://github.com/github/git-reference.git (push)
$ git remote set-url --push origin git://github.com/pjhyett/hw.git
$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
origin  git://github.com/github/git-reference.git (fetch)
origin  git://github.com/pjhyett/hw.git (push)

4

Powinno być tak proste, jak:

git remote set-url origin git://new.url.here

W ten sposób zachowujesz nazwę originswojego nowego repozytorium - a następnie przesuwasz się do nowego repo starego, jak opisano w innych odpowiedziach. Przypuśćmy, że pracujesz sam i masz lokalne repozytorium, które chcesz wykonać w lustrze ze wszystkimi twoimi cruftami, możesz również (z wnętrza lokalnego repozytorium)

git push origin --mirror # origin points to your new repo

ale zobacz Czy „git push --mirror” wystarcza do utworzenia kopii zapasowej mojego repozytorium? (we wszystkich nie używaj, --mirrorale tylko raz).


3

postępuj zgodnie z tymi instrukcjami, jeśli chcesz zachować wszystkie zatwierdzenia i gałęzie ze starego do nowego repozytorium

git clone --bare <old-repo-url>
cd <old-repo-directory>
git push --mirror <new-repo-url>

1

Możesz użyć git-copy, aby powielić repo ze wszystkimi historiami.

git copy http://a.com/old.git http://a.com/new.git

1

Jeśli chcesz przenieść się z jednego miejsca na drugie, a także zachować kopię zapasową bieżącego miejsca na komputerze lokalnym, możesz wykonać następujące czynności:

  1. Najpierw lokalnie przejdź do folderu (git), który chcesz przenieść
  2. Utwórz nowe repozytorium online Ten krok tworzy repozytorium, do którego możemy przekazać kod

Teraz w folderze wykonaj

git remote get-url origin

Powyższe polecenie podaje bieżący adres URL zdalnego źródła, przydatne do przywrócenia źródła w ostatnim kroku

git remote set-url origin git@github.newlocation:folder/newrepo.git

Powyższe polecenie ustawia zdalne źródło na nową lokalizację

git push --set-upstream origin develop

Powyższe polecenie wypycha bieżący aktywny oddział lokalny do zdalnego z rozwijaniem nazwy gałęzi. Oczywiście zachowuje całą historię, ponieważ w przypadku git cała historia jest również wypychana.

git remote set-url origin <original old origin>

Powyższe polecenie przywraca zdalne pochodzenie do bieżącego pochodzenia: chcesz tego, ponieważ znajdujesz się w istniejącym folderze i prawdopodobnie nie chcesz mieszać nazwy bieżącego folderu lokalnego z nowym folderem, który zamierzasz utworzyć w celu klonowania repozytorium właśnie naciskałeś na.

Mam nadzieję że to pomoże,


0

Jeśli chcesz migrować repozytorium #git z jednego serwera na nowy, możesz to zrobić w następujący sposób:

git clone OLD_REPOSITORY_PATH
cd OLD_REPOSITORY_DIR
git remote add NEW_REPOSITORY_ALIAS  NEW_REPOSITORY_PATH
#check out all remote branches 
for remote in `git branch -r | grep -v master `; do git checkout --track $remote ; done
git push --mirror NEW_REPOSITORY_PATH
git push NEW_REPOSITORY_ALIAS --tags

Wszystkie zdalne gałęzie i tagi ze starego repozytorium zostaną skopiowane do nowego repozytorium.

Uruchamianie tego polecenia w pojedynkę:

git push NEW_REPOSITORY_ALIAS

kopiowałby tylko nową gałąź (tylko gałęzie śledzące) do nowego repozytorium.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.