Memindahkan konten repositori Git ke repositori lain yang menyimpan riwayat


153

Saya mencoba memindahkan hanya konten dari satu repositori ( repo1) ke repositori lain yang ada ( repo2) menggunakan perintah berikut:

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

Tapi itu tidak berhasil. Saya meninjau posting serupa, tetapi saya hanya menemukan satu yang memindahkan folder, bukan isinya.


Apakah Anda ingin konten repo1 sebagai cabang di repo2, atau sebagai bagian dari master, sehingga folder dari kedua repo tersebut ada di direktori kerja Anda?
Kronis

Saya ingin memindahkannya sebagai bagian dari master.
Mario

4
Tutorial ini sempurna! smashingmagazine.com/2014/05/19/…
xpto

Jawaban:


259

Saya pikir perintah yang Anda cari adalah:

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

Setelah itu repo2/masterakan berisi semua dari repo2/masterdan repo1/master, dan juga akan memiliki sejarah keduanya.


Terima kasih Chronial, saya hanya ingin memastikan bahwa repo1 juga memiliki satu cabang dan bagaimana jika saya ingin memindahkan cabang itu juga ke repo2?
Mario

Nah, apakah repo2 juga memiliki cabang kedua? Atau apa yang akan terjadi pada cabang itu?
Kronis

1
Kronial, perintah di atas tidak berhasil! itu tidak menyalin sejarah.
Mario

1
Oke, sekarang berhasil. Saya menggunakan perintah berikut; cd repo2,> git remote rm origin> git remote add origin url-of-repo1 ,> git fetch r1remote> git push origin master
Mario

1
@abhijithda Solusi paling sederhana adalah dengan memindahkan semuanya repo1ke dalam subfolder (di dalam repo1) sebelum Anda melakukan penggabungan.
Kronis

63

Dijelaskan dengan sempurna di sini https://www.smashingmagazine.com/2014/05/moving-git-repository-new-server/

Pertama, kita harus mengambil semua cabang dan tag jarak jauh dari repositori yang ada ke indeks lokal kita:

git fetch origin

Kita dapat memeriksa cabang yang hilang yang kita perlukan untuk membuat salinan lokal:

git branch -a

Mari gunakan URL kloning SSH dari repositori baru kita untuk membuat remote baru di repositori lokal kita yang sudah ada:

git remote add new-origin git@github.com:manakor/manascope.git

Sekarang kita siap untuk mendorong semua cabang dan tag lokal ke remote baru bernama new-origin:

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

Mari buat new-origin remote default:

git remote rm origin

Ubah nama new-origin menjadi just origin, sehingga menjadi remote default:

git remote rename new-origin origin

4
Dapat mengonfirmasi bahwa ini menyalin seluruh riwayat dan tag. Sangat bagus. Terima kasih.
Alex

Jika new-origin tidak memiliki commit apa pun, itu berfungsi dengan baik. Namun, jika ada commit di new-origin, cara yang disebutkan di sini tidak akan menghasilkan kata seperti yang diharapkan.
caot

Anda perlu swtich cabang dengan git checkout BranchNamekemudian dorong cabang ke repo jarak jauh lagi dengan git push --all new-origin tapi terima kasih banyak
Raad Altaie

25

Jika Anda ingin melestarikan cabang yang ada dan menjalankan riwayat, inilah salah satu cara yang berhasil untuk saya.

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

Sekarang, misalkan Anda ingin menjaga repo sumber dan tujuan tetap sinkron untuk jangka waktu tertentu. Misalnya, masih ada aktivitas dalam repo jarak jauh saat ini yang ingin Anda pindahkan ke repo baru / pengganti.

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

Untuk menurunkan pembaruan terbaru (dengan asumsi Anda tidak memiliki perubahan lokal):

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

NB: Saya belum menggunakan submodul, jadi saya tidak tahu langkah tambahan apa yang mungkin diperlukan jika Anda memilikinya.


1
Ini bekerja dengan sederhana dan mudah bagi saya. Saya pikir itu harus menjadi jawaban yang dicentang. Jika Anda memiliki 60 cabang, inilah cara yang harus ditempuh.
rickfoosusa

8

Ini berfungsi untuk memindahkan repo lokal saya (termasuk riwayat) ke repo github.com jarak jauh saya. Setelah membuat repo kosong baru di GitHub.com, saya menggunakan URL pada langkah ketiga di bawah dan itu berfungsi dengan baik.

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

Saya menemukan ini di: https://gist.github.com/niksumeiko/8972566


1
Ini adalah cara termudah untuk membiarkan repositori asli. Itu juga menyalin semua cabang.
Guillermo

1
Ini juga menyalin semua tag.
gagak

8

Pendekatan paling sederhana jika kode sudah dilacak oleh Git, setel repositori baru sebagai "asal" Anda untuk didorong.

cd existing-project
git remote set-url origin https://clone-url.git
git push -u origin --all
git push origin --tags

2

Saya menggunakan metode di bawah ini untuk memigrasi GIT Stash saya ke GitLab dengan mempertahankan semua cabang dan riwayat komit.

Gandakan repositori lama ke lokal.

git clone --bare <STASH-URL>

Buat repositori kosong di GitLab.

git push --mirror <GitLab-URL>

1

Sepertinya Anda sudah dekat. Dengan asumsi bahwa ini bukan hanya kesalahan ketik dalam kiriman Anda, langkah 3 harus dilakukan cd repo2sebagai ganti repo1. Dan langkah 6 git pulltidak boleh dipaksakan. Daftar yang dikerjakan ulang:

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

Terima kasih Eric, tetapi pada langkah 3 saya ingin menghapus tautan dari repositori asli untuk menghindari membuat perubahan jarak jauh .. karena saya ingin memindahkan konten dari repo1 ke repo2.
Mario

Baik. Saya telah mengedit jawaban saya untuk mencoba merefleksikannya. Hanya untuk memastikan, Anda mencoba membuat repositori, repo2, yang merupakan salinan dari repo1 tetapi tidak menyimpan repo1 atau origin sebagai remote?
Eric Palace

Tidak, saya tidak mencoba membuat repo baru "repo2". Sebenarnya, saya memiliki repo2 yang memiliki konten init lain. Sekarang saya ingin memindahkan semua isi repo1 ke repo2 dengan history. Saya akan membiarkan repo1 tetap kosong seperti di server.
Mario

Sudahkah Anda mempertimbangkan untuk tidak menggunakan git? Sepertinya Anda mungkin bisa menyalin file (melalui gui atau scp atau ftp) dan secara manual menambahkannya ke repo git Anda. Ini mungkin tidak seefisien, tapi sepertinya lebih sederhana.
Eric Palace

Saya sudah mencobanya tetapi meninggalkan sejarah. Saya ingin memindahkan semua sejarahnya juga.
Mario

1

Sesuai jawaban @ Dan-Cohn Mirror-push adalah teman Anda di sini. Ini tujuan saya untuk memigrasi repo:

Mencerminkan repositori

1.Buka Git Bash.

2.Buat tiruan kosong dari repositori.

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

3.Mirror-push ke repositori baru.

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

4.Hapus repositori lokal sementara yang Anda buat pada langkah 1.

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

Referensi dan Kredit: https://help.github.com/en/articles/duplicating-a-repository


-1

Ada banyak jawaban yang rumit, di sini; namun, jika Anda tidak peduli dengan pelestarian cabang, yang perlu Anda lakukan hanyalah menyetel ulang asal jarak jauh, menyetel upstream, dan mendorong.

Ini bekerja untuk melestarikan semua riwayat komit untuk saya.

cd <location of local repo.>
git remote set-url origin <url>
git push -u origin master
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.