Cara memigrasi repositori GIT dari satu server ke yang baru

264

Saya memiliki server yang akan saya hancurkan. Satu-satunya hal yang tersisa untuk saya migrasi adalah repositori saya. Server ini terdaftar sebagai asal (master) untuk salah satu proyek saya. Apa cara yang tepat untuk memindahkan repositori untuk menyimpan sejarah.

cjibo
sumber
Semua informasi (orgin, trunk, dll.) Tentang repositori disimpan dalam folder bernama '.git', di mana Anda menginisialisasi repositori. Jadi, Anda perlu menyalin konten ke server baru, menggunakan instruksi yang disediakan di sini
Mansab Uppal
1
cukup git config remote.origin.url newurl lihat stackoverflow.com/questions/3011402/…
Niels
1
Jika Anda ingin memigrasikan repo Anda dan semua cabang menggunakan jawabannya oleh jzwiener atau Roberto daripada jawaban yang diterima.
jonaglon

Jawaban:

247

Untuk menambahkan lokasi repo baru,

git remote add new_repo_name new_repo_url

Kemudian dorong konten ke lokasi baru

git push new_repo_name master

Akhirnya hapus yang lama

git remote rm origin

Setelah itu Anda dapat melakukan apa yang dikatakan bdonlan dan mengedit file.git / config untuk mengubah new_repo_name menjadi asal. Jika Anda tidak menghapus sumber asli (repositori jarak jauh asli), Anda cukup mendorong perubahan ke repo baru

git push new_repo_name master
Koby
sumber
8
Apakah ini hanya menyalin satu cabang dari repositori lama ke yang baru?
Andrew Grimm
34
Apa solusi untuk memigrasi semua cabang?
emmby
50
Anda harus dapat mendorong semua cabang sekaligus melalui git push -u new_repo_name --all.
rmarscher
10
Migrasi semua cabang dapat ditemukan di stackoverflow.com/a/18336145/923599
jzwiener
10
Alih-alih mengedit file git-config, perintah ini bekerja untuk saya:git remote rename new_repo_name origin
Salim
210

Jika Anda ingin memigrasi semua cabang dan tag, Anda harus menggunakan perintah berikut:

git clone --mirror [oldUrl]

untuk mengkloning repo lama dengan semua cabang

cd the_repo
git remote add remoteName newRepoUrl

untuk mengatur remote baru

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

untuk mendorong semua referensi di bawah referensi / kepala (yang mungkin Anda inginkan)

jzwiener
sumber
5
Git mengeluh itu --tagsdan refs/heads/*:refs/heads/*tidak kompatibel dengan --mirror. stackoverflow.com/a/26552740/1484831 bekerja dengan baik.
Avigit
3
Saya menggunakan ini dan itu berhasil untuk saya. Mungkin harus menjadi jawaban yang dipilih. Perhatikan bahwa "kode" yang Anda peroleh secara lokal tampaknya berat pada meta data yang membuatnya tidak jelas bagi pemula jika terjadi kesalahan.
nick
3
Ini harus menjadi jawaban yang disetujui. Jauh lebih baik daripada solusi lain
Travis Griggs
15
Saya berakhir dengan semua cabang pada repositori jarak jauh baru saya yang diawali refs/heads/refs/headsmenggunakan git push -f --tags remoteName refs/heads/*:refs/heads/*jadi saya telah bertukar kegit push remoteName --mirror
dumbledad
1
pushjuga mendukung --mirror. git clone --mirror; cd repo; git push --mirror new_remoteharus melakukan trik
knittl
144

Ini berhasil bagi saya dengan sempurna .

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

Saya harus menyebutkan bahwa ini menciptakan cermin dari repo Anda saat ini dan kemudian mendorongnya ke lokasi baru. Oleh karena itu, ini membutuhkan waktu untuk repo besar atau koneksi yang lambat .

Roberto
sumber
15
*** *** yang satu ini
Paul Lockwood
1
Ini adalah solusi yang bagus git remote set-url origin <URL ke lokasi repo BARU saya> (setelah rsync'ed asal lama ke server / lokasi baru)
Toni Homedes i Saun
2
Yang ini bagus sekali. Tidak ada beberapa remote yang membingungkan
TaoPR
17
Lebih git push --mirror originlebih -f.
Aidiakapi
78

Salin. Sangat sederhana. :)

Di sisi klien, cukup edit .git / config di repo lokal klien untuk mengarahkan remote Anda ke URL baru sebagaimana diperlukan.

omong kosong
sumber
6
Anda juga bisa langsung mengkloningnya. Selain itu, alih-alih langsung mengedit file .git / config, Anda dapat menggunakan git remote rm origin; git remote add origin <repositori baru>.
ebneter
4
rming remote akan kehilangan konfigurasi apa pun di bawah bagian konfigurasi tersebut - dan mengkloningnya tanpa mengambil langkah tambahan akan kehilangan cabang selain trunk. Mungkin untuk mengatasi masalah ini, tapi, sungguh - hanya rsync saja.
bdonlan
1
Apa solusinya hanya menggunakan git untuk melakukan pekerjaan? rsync membutuhkan
simpangan
2
ini juga mempertahankan mis. pengait dan konfigurasi lainnya, jadi saya lebih suka solusi murni git
mnagel
66

Ini semacam dilakukan di bagian dalam beberapa jawaban lainnya.

git clone --mirror git@oldserver:oldproject.git
cd oldproject.git
git remote add new git@newserver:newproject.git
git push --mirror new
Ian Walters
sumber
7
Faktanya, ini adalah jawaban yang paling lengkap dan langsung.
Lawrence Dol
4
--mirrordalam dorongan jauh lebih penting: ini harus menjadi jawaban yang benar
PaoloC
Ketika Anda menginisialisasi repositori baru di server baru ingatlah untuk melakukan init kosong atau push tidak akan berhasil:git init --bare
marco
35

Saya hanya memposting ulang apa yang orang lain katakan, dengan sederhana untuk mengikuti daftar instruksi.

  1. Memindahkan repositori: Cukup masuk ke server baru, cdke direktori induk tempat Anda ingin menyimpan repositori, dan gunakan rsyncuntuk menyalin dari server lama:

    new.server> rsync -a -v -e ssh [email protected]:path/to/repository.git .
    
  2. Buat klien menunjuk ke repositori baru: Sekarang pada setiap klien menggunakan repositori, cukup hapus pointer ke asal yang lama, dan tambahkan satu ke yang baru.

    client> git remote rm origin
    client> git remote add origin [email protected]:path/to/repository.git
    
Juan A. Navarro
sumber
Sederhana dan efektif. Anda dapat menambahkan flag --bwlimit = XXX jika Anda ingin membatasi lalu lintas antara server, di mana XXX sama dengan bandwidth dalam KBytes per detik.
Greg Glockner
7
Sedikit lebih baik daripada menghapus dan menambahkan:git remote set-url origin [email protected]:path/to/repository.git
Chris KL
Bagi mereka yang menggunakan server git + capistrano, catat bahwa saya harus menggunakan set-url origin di 2 tempat: di localhost dan di cache-salinan yang ada di server.
anandvc
10

Saya mengikuti instruksi pada BitBucket untuk memindahkan repo dengan semua cabangnya di sana. Inilah langkah-langkah dengan penjelasan berikut #karakter:

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://[email protected]/<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

Bekerja dengan baik untuk saya.

Laryx Decidua
sumber
8

Silakan ikuti langkah-langkahnya:

  • git remote tambahkan yang baru-asal
  • git push --semua sumber baru
  • git push --tags new-origin
  • git asal remote rm
  • git remote ganti nama asal baru
Boush
sumber
5

Ini adalah variasi dari jawaban ini , saat ini disarankan oleh gitlab untuk "memigrasi" repositori git dari satu server ke yang lain.

  1. Mari kita asumsikan bahwa proyek lama Anda dipanggil existing_repo, disimpan dalam existing_repofolder.

  2. Buat repo di server baru Anda. Kami akan menganggap bahwa url dari proyek baru itu adalahgit@newserver:newproject.git

  3. Buka antarmuka baris perintah, dan masukkan yang berikut ini:

    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
    

Manfaat dari pendekatan ini adalah Anda tidak menghapus cabang yang sesuai dengan server lama Anda.

Sejuk
sumber
4

Anda dapat menggunakan perintah berikut:

git remote set-url --push origin new_repo_url

Contoh dari http://gitref.org/remotes/

$ git remote -v
github  [email protected]:schacon/hw.git (fetch)
github  [email protected]: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  [email protected]:schacon/hw.git (fetch)
github  [email protected]:schacon/hw.git (push)
origin  git://github.com/github/git-reference.git (fetch)
origin  git://github.com/pjhyett/hw.git (push)
mrroboaat
sumber
4

Seharusnya sesederhana:

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

Dengan cara ini Anda menyimpan nama originuntuk repo baru Anda - lalu dorong ke repo baru yang lama seperti yang terinci dalam jawaban lainnya. Andaikata Anda bekerja sendirian dan Anda memiliki repo lokal yang ingin Anda pantulkan dengan semua cruft Anda di dalamnya, Anda mungkin juga (dari dalam repo lokal Anda)

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

tetapi lihat "git push --mirror" cukup untuk mencadangkan repositori saya? (semuanya tidak digunakan --mirrortetapi sekali).

Mr_and_Mrs_D
sumber
3

ikuti instruksi ini Jika Anda ingin menjaga semua komit dan cabang dari repo lama ke baru

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

Anda dapat menggunakan git-copy untuk menggandakan repo dengan semua riwayat.

git copy http://a.com/old.git http://a.com/new.git
Quanlong
sumber
1

Jika Anda ingin berpindah dari satu sumber ke sumber lain dan juga menyimpan cadangan sumber asal Anda saat ini di mesin lokal Anda, Anda bisa menggunakan langkah-langkah ini:

  1. Pertama, masuk secara lokal ke folder (git) yang ingin Anda pindahkan
  2. Buat repositori baru online. Langkah ini membuat repositori tempat kita dapat mendorong kode

Sekarang di folder lakukan

git remote get-url origin

Perintah di atas memberikan url asal remote saat ini, berguna untuk mengatur asal kembali pada langkah terakhir

git remote set-url origin [email protected]:folder/newrepo.git

Perintah di atas menetapkan asal jarak jauh ke lokasi baru

git push --set-upstream origin develop

Perintah di atas mendorong cabang lokal aktif saat ini ke jarak jauh dengan mengembangkan branchname. Tentu saja mempertahankan semua sejarah karena dengan git semua sejarah juga didorong.

git remote set-url origin <original old origin>

Perintah di atas mengatur kembali asal remote ke asal Anda saat ini: Anda menginginkan ini karena Anda berada di folder yang ada dan Anda mungkin tidak ingin mencampur nama folder lokal Anda saat ini dengan folder baru yang akan Anda buat untuk mengkloning repo Anda baru saja didorong.

Semoga ini membantu,

Hace
sumber
0

Jika Anda ingin memigrasi repositori #git dari satu server ke yang baru, Anda dapat melakukannya seperti ini:

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

Semua cabang dan tag jarak jauh dari repositori lama akan disalin ke repositori baru.

Menjalankan perintah ini sendiri:

git push NEW_REPOSITORY_ALIAS

hanya akan menyalin cabang master (hanya cabang pelacakan) ke repositori baru.

maestr0
sumber