Cadangkan repo git sepenuhnya?

142

Apakah ada cara sederhana untuk mencadangkan seluruh repo git termasuk semua cabang dan tag?

Daniel Upton
sumber
2
Saya kira Anda mengacu pada repo git lokal di sini.
Ztyx
2
kemungkinan duplikat dari Backup a Local Git Repository
Martin Thoma
3
Jawaban yang benar adalah dengan melakukan: git clone --mirror [email protected]/your-repo.git Ini akan menyalin seluruh repositori, catatan, cabang, pelacakan, dll.
John
Beberapa pencarian web yang saya jalankan tidak menyertakan pertanyaan ini dalam hasilnya: "git clone absolut semua catatan tanda cabang"; "git mengkloning semua yang ada di repositori"; "git mengkloning repo dengan semua catatan tag".
Kenny Evitt

Jawaban:

66

Ada apa dengan hanya membuat tiruannya?

git clone --mirror other/repo.git

Setiap repositori adalah cadangan dari remote-nya.

KingCrunch
sumber
7
@Daniel: Jika Anda menggandakan repositori, Anda mengambil setiap cabang, tetapi hanya yang default yang diperiksa. Coba 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.
KingCrunch
1
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.
peterh
@peterh Tentu, tapi git clonemencakup 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 clonesudah mencakup poin-poin yang relevan, untuk apa Anda membutuhkan alat yang berbeda? Meskipun saya juga lebih suka git bundlesaya tidak berpikir jawaban saya salah, atau tidak valid. Anda dapat melihat kedua pendekatan sebagai hot- vs cold-backup.
KingCrunch
bagaimana dengan izin file? apakah git clone selalu menyalinnya? tergantung pada pilihan yang saya percaya
antirealm
200
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 bundlehanya 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
VonC
sumber
13
tambahkan - semua untuk pencadangan lengkap
lihat
1
Ini, git bundlejawaban 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.
peterh
3
Perhatikan bahwa tidak ada git bundleatau git clonemendapatkan semuanya , misalnya skrip hook.
Zitrax
2
@Zitrax Ya, memang sesuai desain. Pengait bisa berbahaya atau menyertakan informasi sensitif.
VonC
Dapatkah saya menggunakan git bundlerepo jarak jauh?
Ryan Shillington
24

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 updatedari 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

fantabolous
sumber
21

Memperluas jawaban hebat dari KingCrunch dan VonC

Saya menggabungkan keduanya:

git clone --mirror [email protected]/reponame reponame.git
cd reponame.git
git bundle create reponame.bundle --all

Setelah itu Anda memiliki file bernama reponame.bundleyang dapat dengan mudah disalin. Anda kemudian dapat membuat repositori git normal baru dari itu menggunakan git clone reponame.bundle reponame.

Perhatikan bahwa git bundlehanya salinan komit yang mengarah ke beberapa referensi (cabang atau tag) di repositori. Jadi, komitmen kusut tidak disimpan ke bundel.

Kimmo Ahokas
sumber
1
Ringkasan yang bagus. +1.
VonC
2
Saya pikir maksud Anda git bundle create reponame.bundle --all?
joe
Terima kasih @ Joe karena memperhatikan itu. Pastinya. Saya akan memperbarui jawabannya.
Kimmo Ahokas
5

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.

Sunil Khiatani
sumber
4

Semuanya ada di dalam .gitdirektori. Cukup cadangkan itu bersama dengan proyek Anda seperti yang Anda lakukan pada file apa pun.

Oren Hizkiya
sumber
2
Apakah ini berarti, mencadangkan SEMUA konten direktori yang berisi proyek Git saja sudah cukup?
Ravindranath Akila
1
Setuju dengan Sunil - ini tampaknya bukan operasi atom.
jia103
1
Dan bagaimana Anda memastikan tidak ada perubahan yang dilakukan pada file di direktori tersebut saat membuat cadangan?
Raedwald
Seperti yang diisyaratkan Raedwald, metode ini dapat menghasilkan pencadangan yang tidak konsisten dan karenanya menyebabkan hilangnya data. Oleh karena itu jawaban ini harus dihilangkan, atau paling tidak, memperingatkan tentang kemungkinan kehilangan data.
Abhishek Anand
Saya pikir dia tahu perintah copyor dengan cpsangat baik dan itu tidak sesuai dengan kebutuhannya. Dan menurut saya, menurutnya repositori kosong (meskipun bisa juga disalin, menurut saya ini bukan cadangan berfitur lengkap).
peterh
4

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:

  • Tujuannya adalah untuk mendapatkan backup "lengkap" dari repositori git sedekat mungkin.

Kemudian memperkayanya dengan keinginan khas dan menentukan beberapa pengaturan awal:

  • Backup melalui "hot-copy" lebih disukai untuk menghindari waktu henti layanan.
  • Kekurangan git akan diatasi dengan perintah tambahan.
  • Skrip harus melakukan pencadangan untuk menggabungkan beberapa langkah untuk satu pencadangan dan untuk menghindari kesalahan manusia (kesalahan ketik, dll.).
  • Selain itu, skrip harus melakukan pemulihan untuk menyesuaikan dump ke mesin target, misalnya bahkan konfigurasi mesin asli mungkin telah berubah sejak pencadangan.
  • Lingkungan adalah server git di mesin Linux dengan sistem file yang mendukung tautan keras.

1. Apa yang dimaksud dengan git repo backup "penuh"?

Sudut pandangnya berbeda tentang apa itu cadangan "100%". Berikut ini dua contoh tipikal.

# 1 Sudut pandang pengembang

  • Kandungan
  • Referensi

git adalah alat pengembang dan mendukung sudut pandang ini melalui git clone --mirrordan git bundle --all.

Sudut pandang # 2 Admin

  • File konten
    • Kasus khusus "packfile": git menggabungkan dan memadatkan objek ke dalam file paket selama pengumpulan sampah (lihat git gc)
  • konfigurasi git
  • Opsional: Konfigurasi OS (izin sistem file, dll.)

git adalah alat pengembang dan menyerahkannya kepada admin. Cadangan konfigurasi git dan konfigurasi OS harus dilihat sebagai terpisah dari cadangan konten.

2. Teknik

  • "Cold-Copy"
    • Hentikan layanan untuk memiliki akses eksklusif ke file-nya. Downtime!
  • "Hot-Copy"
    • Layanan menyediakan status tetap untuk tujuan pencadangan. Perubahan yang sedang berlangsung tidak memengaruhi status itu.

3. Topik lain untuk dipikirkan

Kebanyakan dari mereka adalah generik untuk backup.

  • Apakah ada cukup ruang untuk menyimpan cadangan penuh? Berapa generasi yang akan disimpan?
  • Apakah pendekatan inkremental diinginkan? Berapa generasi yang akan disimpan dan kapan harus membuat cadangan lengkap lagi?
  • Bagaimana cara memverifikasi bahwa cadangan tidak rusak setelah pembuatan atau seiring waktu?
  • Apakah sistem file mendukung tautan keras?
  • Masukkan cadangan ke dalam satu file arsip atau gunakan struktur direktori?

4. Apa yang disediakan git untuk konten cadangan

  • git gc --auto

    • docs: man git-gc
    • Membersihkan dan memadatkan repositori.
  • git bundle --all

    • docs: man git-bundle, man git-rev-list
    • Atomic = "Hot-Copy"
    • Bundel adalah file dump dan bisa langsung digunakan dengan git (verifikasi, kloning, dll.).
    • Mendukung ekstraksi inkremental.
    • Dapat diverifikasi melalui git bundle verify.
  • git clone --mirror

    • dokumen: man git-clone, man git-fsck, Apa perbedaan antara git clone --mirror dan git clone --bare
    • Atomic = "Hot-Copy"
    • Mirror adalah repositori git nyata.
    • Maksud utama dari perintah ini adalah untuk membuat cermin aktif penuh, yang secara berkala mengambil pembaruan dari repositori asli.
    • Mendukung hardlink untuk mirror pada sistem file yang sama untuk menghindari pemborosan ruang.
    • Dapat diverifikasi melalui git fsck.
    • Mirror dapat digunakan sebagai dasar untuk skrip cadangan file lengkap.

5. Cold-Copy

Cadangan salinan dingin selalu dapat melakukan pencadangan file lengkap: tolak semua akses ke repo git, lakukan pencadangan, dan izinkan akses lagi.

  • Masalah yang Mungkin
    • Mungkin tidak mudah - atau bahkan mungkin - untuk menolak semua akses, misalnya akses bersama melalui sistem file.
    • Meskipun repo berada di mesin khusus klien dengan satu pengguna, pengguna tersebut masih dapat melakukan sesuatu selama proses pencadangan otomatis :(
    • Waktu henti mungkin tidak dapat diterima di server dan melakukan pencadangan beberapa repo besar bisa memakan waktu lama.
  • Ide untuk Mitigasi:
    • Cegah akses repo langsung melalui sistem file secara umum, meskipun klien menggunakan mesin yang sama.
    • Untuk akses SSH / HTTP, gunakan pengelola otorisasi git (mis. Gitolite) untuk mengelola akses secara dinamis atau mengubah file otentikasi dengan cara skrip.
    • Cadangkan repo satu per satu untuk mengurangi waktu henti untuk setiap repo. Tolak satu repo, lakukan pencadangan dan izinkan akses lagi, lalu lanjutkan dengan repo berikutnya.
    • Memiliki jadwal perawatan yang direncanakan untuk menghindari kesal pengembang.
    • Cadangan hanya jika repositori telah berubah. Mungkin sangat sulit untuk diterapkan, misalnya daftar objek ditambah dengan file paket dalam pikiran, checksum konfigurasi dan kait, dll.

6. Hot-Copy

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.

Cadangan salinan cepat "100% admin"

  • Opsi 1: gunakan git bundle --alluntuk membuat file dump penuh / inkremental dari konten dan menyalin / mencadangkan file konfigurasi secara terpisah.
  • Opsi 2: Gunakan git clone --mirror, tangani, dan salin konfigurasi secara terpisah, lalu lakukan backup file penuh dari mirror.
    • Catatan:
    • Mirror adalah repositori baru, yang diisi dengan template git saat ini saat pembuatan.
    • Bersihkan file dan direktori konfigurasi, lalu salin file konfigurasi dari repositori sumber asli.
    • Skrip cadangan juga dapat menerapkan konfigurasi OS seperti izin file di cermin.
    • Gunakan sistem file yang mendukung tautan keras dan buat cermin pada sistem file yang sama dengan repositori sumber untuk mendapatkan kecepatan dan mengurangi konsumsi ruang selama pencadangan.

7. Pulihkan

  • Periksa dan adopsi konfigurasi git ke mesin target dan filosofi "cara kerja" terbaru.
  • Periksa dan adopsi konfigurasi OS ke mesin target dan filosofi "cara kerja" terbaru.
Maddes
sumber
3

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
Quanlong
sumber
2
github.com/cybertk/git-copy/blob/master/bin/git-copy#L8-L36 : tampaknya banyak pekerjaan untuk git clone --bare+ sederhana git push --force.
VonC
@VonC Ya, tetapi VonC dapat memiliki beberapa fitur tambahan selama pengemasan ulang, atau dapat menambang struktur internal git repo, yang dapat digunakan untuk beberapa pengoptimalan (restrukturisasi tujuan, atau peningkatan kecepatan, dll).
peterh
3

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

John
sumber
Apakah git clone --mirror membuat backup point-in-time yang konsisten? Apa pengguna mendorong komit selama pencadangan? Apakah ditolak, diantrekan, atau dimasukkan ke dalam cadangan?
Benjamin Goodacre
0
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.

Arne
sumber
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.
peterh
0

Berikut dua opsi:

  1. 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.

  2. 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}
    
vishal sahasrabuddhe
sumber
Saya pikir dia tahu perintah klon atau tar 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 seperti 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.
peterh
3
peterh, Jelas dia tidak meminta perintah tar atau klon. Jika Anda melihat lebih dekat, saya juga tidak menjelaskan perintah itu. Apa yang saya coba jelaskan adalah cadangan Git melalui metode berbeda yang mungkin menyertakan berbagai perintah Linux yang tidak berarti bahwa saya mengajarkan perintah-perintah linux tersebut. Saya mencoba untuk memberikan sedikit ide di sini.
vishal sahasrabuddhe
0

Jika ada di Github, Navigasikan ke bitbucket dan gunakan metode "import repositori" untuk mengimpor repo github Anda sebagai repo pribadi.

Jika ada di bitbucket, Lakukan sebaliknya.

Ini adalah cadangan penuh tetapi tetap di cloud yang merupakan metode ideal saya.

Mohammad
sumber
-7

Sejauh yang saya tahu Anda bisa membuat salinan direktori tempat repo Anda berada, itu saja!

cp -r project project-backup
Richard Tuin
sumber
Adakah yang bisa mengkonfirmasi ini? Saya merasa ini adalah pendekatan yang tepat untuk membuat cadangan yang tepat.
Ravindranath Akila
5
Saya pikir Anda bisa berakhir dengan snapshot yang tidak konsisten ketika selama operasi penyalinan perubahan dilakukan / didorong ke repositori. Menggunakan perintah git seperti git clone --bareakan memberi Anda snapshot yang konsisten.
Eelke
1
Setuju dengan Sunil - ini tampaknya tidak atom.
jia103
1
@ jia103 Tidak selalu menjadi masalah jika tidak atomic - Anda hanya perlu tahu, dan harus mampu, untuk menjamin bahwa tidak ada orang lain yang dapat menjangkau repo saat Anda mengerjakannya. Tapi saya pikir OP menginginkan yang spesifik, untuk alat git repos yang dioptimalkan untuk tugas tersebut, salinan file sederhana mungkin terkenal untuknya.
peterh