Saya memiliki repo Git lokal yang ingin saya dorong ke repo jarak jauh baru (repo baru yang dibuat di Beanstalk, jika itu penting).
Repo lokal saya memiliki beberapa cabang dan tag, dan saya ingin menyimpan semua sejarah saya.
Sepertinya pada dasarnya saya hanya perlu melakukan git push
, tetapi itu hanya mengunggah master
cabang.
Bagaimana cara mendorong semuanya sehingga saya mendapatkan replika lengkap repo lokal saya di remote?
Jawaban:
Untuk mendorong semua cabang Anda , gunakan salah satu (ganti REMOTE dengan nama remote, misalnya "asal"):
Untuk mendorong semua tag Anda :
Akhirnya, saya pikir Anda bisa melakukan ini semua dalam satu perintah dengan:
Namun, di samping itu
--mirror
, juga akan mendorong remote Anda, jadi ini mungkin bukan yang Anda inginkan.sumber
--all
bukannya*:*
tampak lebih ramahgit push REMOTE --all
kembaliNo refs in common and none specified;
tidak melakukan apa-apa, sementaragit push REMOTE "*:*
sebenarnya mendorong semua cabang ke jarak jauh.git clone --mirror old-remote-url; cd repo.git; git push --mirror new-remote-url
.Dalam kasus seperti saya bahwa Anda memperoleh repo dan sekarang mengalihkan asal remote ke repo yang berbeda, yang baru kosong ...
Jadi Anda memiliki repo dan semua cabang di dalamnya, tetapi Anda masih perlu memeriksa cabang-cabang itu untuk
git push --all
perintah untuk benar-benar mendorongnya juga.Anda harus melakukan ini sebelum menekan:
Diikuti oleh
sumber
git push '*:*'
mendorong semua cabang.git push -all
baru saja mendorong tuannya. Saya memindahkan repo dari github ke bitbucket.--track remotes/$remote
alih-alih--track $remote
. Inilah baris perintah lengkap:for remote in `git branch -r | grep -v master `; do git checkout --track remotes/$remote ; done
Berikut ini adalah pandangan lain tentang hal yang sama yang bekerja lebih baik untuk situasi yang saya alami. Ini memecahkan masalah di mana Anda memiliki lebih dari satu remote, ingin mengkloning semua cabang di remote
source
ke remotedestination
tetapi tanpa harus memeriksa semuanya terlebih dahulu.(Masalah yang saya miliki dengan solusi Daniel adalah bahwa ia akan menolak untuk checkout cabang pelacakan dari
source
jarak jauh jika saya sudah memeriksanya sebelumnya, yaitu, itu tidak akan memperbarui cabang lokal saya sebelum push)ini akan mendorong semua cabang dalam jarak jauh
source
ke cabang kepaladestination
, mungkin melakukan dorongan non-maju cepat. Anda masih harus mendorong tag secara terpisah.sumber
remote
sama lain. Terima kasih!git push destination +refs/remotes/source/\*:refs/heads/\*
--prune
opsi.--mirror
parameter biasa yang direkomendasikan semua orang. Berfungsi sempurna untuk skenario di mana Anda hanya ingin tetap menyinkronkan dua remote untuk tujuan otomatisasi atau audit.Ini adalah cara paling ringkas yang saya temukan, asalkan tujuannya kosong. Beralih ke folder kosong dan kemudian:
Ganti
https://...
untukfile:///your/repo
dll yang sesuai.sumber
Halaman manual
git-push
ini layak dibaca. Digabungkan dengan situs web ini, saya menulis yang berikut ini di.git/config
:The
push = :
berarti "mendorong setiap 'pencocokan' cabang (yaitu cabang yang sudah ada di repositori remote dan memiliki mitra lokal)", sedangkanpush = refs/tags/*
berarti "mendorong semua tag".Jadi sekarang saya hanya perlu menjalankan
git push
untuk mendorong semua cabang yang cocok dan semua tag.Ya, ini tidak seperti yang diinginkan OP (semua cabang untuk mendorong harus sudah ada di sisi yang jauh), tetapi mungkin bermanfaat bagi mereka yang menemukan pertanyaan ini sambil mencari "bagaimana cara mendorong cabang dan tag pada saat yang sama waktu".
sumber
Dalam kasus saya apa yang berhasil adalah.
sumber
origin
alias untuk repositori URL Git jarak jauh.Mencerminkan repositori
Buat tiruan kosong dari repositori.
Dorong cermin ke repositori baru.
Hapus repositori lokal sementara yang Anda buat pada langkah 1.
Mencerminkan repositori yang berisi objek Penyimpanan File Besar Git
Buat tiruan kosong dari repositori. Ganti nama pengguna contoh dengan nama orang atau organisasi yang memiliki repositori, dan ganti nama repositori contoh dengan nama repositori yang ingin Anda gandakan.
Arahkan ke repositori yang baru saja Anda kloning.
Tarik objek Git Large File Storage di repositori.
Dorong cermin ke repositori baru.
Dorong objek Git Large File Storage repositori ke mirror Anda.
Hapus repositori lokal sementara yang Anda buat pada langkah 1.
Instruksi di atas berasal dari Bantuan Github: https://help.github.com/articles/duplicating-a-repository/
sumber
Saya menemukan jawaban di atas masih memiliki beberapa hal yang tidak jelas, yang akan menyesatkan pengguna. Pertama, yakin
git push new_origin --all
dangit push new_origin --mirror
tidak bisa menduplikasi semua cabang asal, itu hanya menduplikasi cabang lokal yang ada ke new_origin Anda.Di bawah ini adalah dua metode berguna yang telah saya uji:
1, duplikat dengan clone bare repo.
git clone --bare origin_url
, lalu masukkan folder, dangit push new_origin_url --mirror
. Dengan cara ini, Anda juga dapat menggunakangit clone --mirror origin_url
, keduanya--bare
dan--mirror
akan mengunduh repo kosong, tidak termasuk ruang kerja. silakan lihat ini2, Jika Anda memiliki repo git dengan menggunakan
git clone
, yang berarti Anda memiliki repo dan ruang kerja git, Anda dapat menggunakangit remote add new_origin new_origin_url
, lalugit push new_origin +refs/remotes/origin/\*:refs/heads/\*
, lalugit push new_origin --tags
Dengan cara ini, Anda akan mendapatkan cabang tambahan, yang tidak masuk akal.
sumber
Untuk mendorong cabang dan tag (tetapi tidak jauh):
Ini sama dengan menggabungkan opsi
--tags
dan--all
untukgit push
, yang tampaknya tidak diizinkan oleh git.sumber
+refs/remotes/source/*
Berbasis di @aniel jawaban yang saya lakukan:
sumber
| grep -v master
dapat diganti dengan| sed 's/\*//'
(saya berasumsi Anda dikecualikanmaster
untuk menghindari sedikit jahat*
yang ditambahkan ke cabang yang saat ini dipilih) yang memungkinkan Anda untuk memasukkanmaster
dan menghindari masalah ketikamaster
bukan cabang yang Anda pilih saat ini. Juga maaf untuk necroposting, hanya saja jawaban ini membantu saya hari ini dan saya ingin membagikan modifikasi saya jika dapat membantu orang lain di posisi saya ...Saya menemukan bahwa semua ini tampaknya tidak berfungsi dengan baik untuk saya. Merasa bebas untuk menyalakan ini sampai mati tetapi karena alasan tertentu tidak bisa mendapatkan opsi lain untuk berfungsi dengan baik.
Hasil yang diharapkan adalah repo "kloning" ke jarak jauh lain (yaitu dari Github ke penyedia lain):
Masalah utama yang saya lihat adalah apakah semua cabang jarak jauh tidak dibuat ulang di remote baru. Jika suatu perintah melakukan, remote baru tidak memiliki sejarah cabang (yaitu melakukan
git checkout branch; git log
tidak akan menunjukkan komitmen cabang yang diharapkan).Saya perhatikan
git checkout -b branchname
TIDAK sama dengangit checkout branchname
(yang terakhir adalah yang saya butuhkan). Saya perhatikangit checkout --track branchname
sepertinya tidak menarik sejarah cabang.Solusi Saya (berbasis PowerShell):
sumber
Perintah di bawah ini akan mendorong semua cabang ( termasuk yang Anda belum pernah check-out tetapi ada di git repo Anda, Anda dapat melihatnya dengan
git branch -a
)git push origin '*:*'
sumber
Saya sedang dalam proses beralih dari satu layanan kontrol versi ke yang lain dan perlu mengkloning semua repositori termasuk semua cabang, tag dan riwayat.
Untuk mencapai di atas saya lakukan selanjutnya:
git push origin '*:*'
Script .sh yang digunakan untuk checkout semua cabang ke repositori lokal:
sumber