Apakah ada cara sederhana untuk mencadangkan seluruh repo git termasuk semua cabang dan tag?
Apakah ada cara sederhana untuk mencadangkan seluruh repo git termasuk semua cabang dan tag?
Jawaban:
Ada apa dengan hanya membuat tiruannya?
git clone --mirror other/repo.git
Setiap repositori adalah cadangan dari remote-nya.
git branch -a
. Mungkin lebih jelas begini: Setelah mengkloning repositori Anda tidak mengambil setiap cabang, Anda mengambil setiap komit. Cabang hanya merujuk ke komit yang ada.
git clone
mencakup semua itu. (1) bersifat opsional, bukan persyaratan. Jika hasilnya masih optimal, itu masih cadangan (2) sudah tercakup oleh git itu sendiri. - Poin yang ingin saya berikan adalah, jika git clone
sudah mencakup poin-poin yang relevan, untuk apa Anda membutuhkan alat yang berbeda? Meskipun saya juga lebih suka git bundle
saya tidak berpikir jawaban saya salah, atau tidak valid. Anda dapat melihat kedua pendekatan sebagai hot- vs cold-backup.
git bundle
Saya suka metode itu, karena hanya menghasilkan satu file, lebih mudah untuk disalin.
Lihat ProGit: seikat kecil kegembiraan .
Lihat juga " Bagaimana cara mengirim email ke seseorang tentang repositori git? ", Di mana perintahnya
git bundle create /tmp/foo-all --all
rinci:
git bundle
hanya akan mengemas referensi yang ditunjukkan oleh git show-ref : ini termasuk head, tag, dan remote head.
Sangat penting bahwa basis yang digunakan dipegang oleh destinasi.
Tidak apa-apa untuk melakukan kesalahan di sisi kehati-hatian, menyebabkan file bundel berisi objek yang sudah ada di tujuan, karena ini diabaikan saat membongkar di tujuan.
Untuk menggunakan bundel itu, Anda dapat mengkloningnya, dengan menentukan folder yang tidak ada (di luar repo git apa pun):
git clone /tmp/foo-all newFolder
git bundle
jawaban yang benar menurut saya, dan bukan yang diterima. Saya pikir dia tahu perintah klon dengan baik, jika dia bisa menanyakan pertanyaan seperti itu, dan itu jelas tidak cukup baginya (karena itu adalah klon, dan bukan dump). Dump adalah hal yang berbeda dari salinan sederhana, misalnya: 1) tidak perlu optimal (atau bahkan mampu) untuk pekerjaan normal 2) tetapi dituntut memiliki ketahanan dan repairibilitas yang baik terhadap korupsi data 3) Seringkali berguna jika mereka dengan mudah dapat di-diff untuk cadangan tambahan, sementara itu bukan tujuan pada salinan.
git bundle
atau git clone
mendapatkan semuanya , misalnya skrip hook.
git bundle
repo jarak jauh?
Memperluas beberapa jawaban lain, inilah yang saya lakukan:
Siapkan repo: git clone --mirror user@server:/url-to-repo.git
Kemudian saat Anda ingin menyegarkan cadangan: git remote update
dari lokasi klon.
Ini mencadangkan semua cabang dan tag, termasuk yang baru yang ditambahkan kemudian, meskipun perlu dicatat bahwa cabang yang dihapus tidak terhapus dari klon (yang untuk cadangan mungkin merupakan hal yang baik).
Ini adalah atom sehingga tidak memiliki masalah seperti salinan sederhana.
Lihat http://www.garron.me/en/bits/backup-git-bare-repo.html
Memperluas jawaban hebat dari KingCrunch dan VonC
Saya menggabungkan keduanya:
git clone --mirror git@some.origin/reponame reponame.git
cd reponame.git
git bundle create reponame.bundle --all
Setelah itu Anda memiliki file bernama reponame.bundle
yang dapat dengan mudah disalin. Anda kemudian dapat membuat repositori git normal baru dari itu menggunakan git clone reponame.bundle reponame
.
Perhatikan bahwa git bundle
hanya salinan komit yang mengarah ke beberapa referensi (cabang atau tag) di repositori. Jadi, komitmen kusut tidak disimpan ke bundel.
git bundle create reponame.bundle --all
?
gunakan git bundle, atau clone
menyalin direktori git bukanlah solusi yang baik karena tidak atomic. Jika Anda memiliki repositori besar yang membutuhkan waktu lama untuk menyalin dan seseorang mendorong ke repositori Anda, itu akan memengaruhi pencadangan Anda. Mengkloning atau membuat bundel tidak akan mengalami masalah ini.
Semuanya ada di dalam .git
direktori. Cukup cadangkan itu bersama dengan proyek Anda seperti yang Anda lakukan pada file apa pun.
copy
or dengan cp
sangat baik dan itu tidak sesuai dengan kebutuhannya. Dan menurut saya, menurutnya repositori kosong (meskipun bisa juga disalin, menurut saya ini bukan cadangan berfitur lengkap).
Utas ini sangat membantu untuk mendapatkan beberapa wawasan bagaimana backup repo git dapat dilakukan. Menurut saya masih kurang beberapa petunjuk, informasi atau kesimpulan untuk menemukan "cara yang benar" (tm) bagi diri sendiri. Oleh karena itu berbagi pemikiran saya di sini untuk membantu orang lain dan menempatkan mereka untuk diskusi untuk meningkatkan mereka. Terima kasih.
Jadi, mulailah dengan mengambil pertanyaan asli:
Kemudian memperkayanya dengan keinginan khas dan menentukan beberapa pengaturan awal:
Sudut pandangnya berbeda tentang apa itu cadangan "100%". Berikut ini dua contoh tipikal.
git adalah alat pengembang dan mendukung sudut pandang ini melalui git clone --mirror
dan git bundle --all
.
git gc
)git adalah alat pengembang dan menyerahkannya kepada admin. Cadangan konfigurasi git dan konfigurasi OS harus dilihat sebagai terpisah dari cadangan konten.
Kebanyakan dari mereka adalah generik untuk backup.
git gc --auto
git bundle --all
git bundle verify
.git clone --mirror
git fsck
.Cadangan salinan dingin selalu dapat melakukan pencadangan file lengkap: tolak semua akses ke repo git, lakukan pencadangan, dan izinkan akses lagi.
Pencadangan file tidak dapat dilakukan dengan repo aktif karena risiko data rusak oleh komitmen yang sedang berlangsung. Salinan panas menyediakan status tetap dari repositori aktif untuk tujuan pencadangan. Komit yang sedang berlangsung tidak memengaruhi salinan itu. Seperti yang tercantum di atas, fungsi klon dan bundel git mendukung hal ini, tetapi untuk cadangan "100% admin" beberapa hal harus dilakukan melalui perintah tambahan.
git bundle --all
untuk membuat file dump penuh / inkremental dari konten dan menyalin / mencadangkan file konfigurasi secara terpisah.git clone --mirror
, tangani, dan salin konfigurasi secara terpisah, lalu lakukan backup file penuh dari mirror.
Anda dapat mencadangkan git repo dengan git-copy dengan ukuran penyimpanan minimum.
git copy /path/to/project /backup/project.repo.backup
Kemudian Anda dapat memulihkan proyek Anda dengan git clone
git clone /backup/project.repo.backup project
git clone --bare
+ sederhana git push --force
.
Jawaban yang benar IMO adalah git clone --mirror . Ini akan mencadangkan repo Anda sepenuhnya.
Git clone mirror akan mengkloning seluruh repositori, catatan, head, refs, dll. Dan biasanya digunakan untuk menyalin seluruh repositori ke server git baru. Ini akan menarik semua cabang dan semuanya, seluruh repositori.
git clone --mirror git@example.com/your-repo.git
Biasanya kloning repo tidak mencakup semua cabang, hanya Master.
Menyalin folder repo hanya akan "menyalin" cabang yang telah ditarik ... jadi secara default hanya cabang Master atau cabang lain yang telah Anda periksa sebelumnya.
Perintah Git bundle juga bukan yang Anda inginkan: "Perintah bundle akan mengemas semua yang biasanya didorong melalui kabel dengan perintah git push ke dalam file biner yang dapat Anda kirimi email ke seseorang atau dimasukkan ke flash drive, lalu pisahkan ke dalam repositori lain. " (Dari Apa perbedaan antara git clone --mirror dan git clone --bare )
cd /path/to/backupdir/
git clone /path/to/repo
cd /path/to/repo
git remote add backup /path/to/backupdir
git push --set-upstream backup master
ini membuat cadangan dan membuat pengaturan, sehingga Anda dapat melakukan git push untuk memperbarui cadangan Anda, apa yang mungkin ingin Anda lakukan. Pastikan saja, bahwa / path / to / backupdir dan / path / to / repo setidaknya adalah hard drive yang berbeda, jika tidak maka tidak masuk akal untuk melakukan itu.
Berikut dua opsi:
Anda dapat langsung mengambil tar dari direktori git repo karena ia memiliki seluruh konten repo yang kosong di server. Ada sedikit kemungkinan bahwa seseorang sedang mengerjakan repo saat mengambil cadangan.
Perintah berikut akan memberi Anda tiruan repo telanjang (seperti yang ada di server), lalu Anda dapat mengambil tar dari lokasi tempat Anda telah mengkloning tanpa masalah apa pun.
git clone --bare {your backup local repo} {new location where you want to clone}
Sejauh yang saya tahu Anda bisa membuat salinan direktori tempat repo Anda berada, itu saja!
cp -r project project-backup
git clone --bare
akan memberi Anda snapshot yang konsisten.