Pertanyaan GIT sebagai alat cadangan


Di server, instal git

cd /
git init
git add .
git commit -a -m "Yes, this is server"

Lalu, dapatkan /.git/ untuk menunjuk ke drive jaringan (SAN, NFS, Samba apa pun) atau disk yang berbeda. Gunakan tugas cron setiap jam / hari dll untuk memperbarui perubahan. Direktori .git akan berisi salinan berversi dari semua file server (tidak termasuk yang tidak berguna / rumit seperti / proc, / dev dll.)

Untuk server pengembangan yang tidak penting di mana saya tidak ingin kerumitan / biaya pengaturannya pada sistem cadangan yang tepat, dan di mana backup hanya untuk kenyamanan (I.Ekita tidak perlu untuk mencadangkan server ini tetapi akan menghemat waktu jika ada yang salah), mungkinkah ini solusi pencadangan yang valid atau akan jatuh ke tumpukan kotoran besar?


88
2017-12-15 12:10




tidak sparkleshare menggunakan ide serupa ?? - B14D3
@ B14D3 Saya pikir sparkleshare lebih dari semacam jenis dropbox, tapi saya akan memeriksanya - Smudge
Anda benar, tetapi menggunakan git untuk membuat semacam masalah (menyalin ke beberapa pc dan mengontrol versi file);) - B14D3
Masalah besar dengan ini adalah bahwa tidak ada kontrol pusat - Anda harus memiliki akses langsung (ssh) ke mesin untuk melakukan bentuk sebelumnya segala bentuk pemeliharaan atau validasi cadangan. Saya selalu menemukan menginstal aplikasi pada kotak untuk dicadangkan kemudian mengelola mereka dari lokasi pusat adalah kemenangan yang jauh lebih besar. - hafichuk
@hafichuk Dengan alat seperti Wayang / Chef itu bukan masalah besar, tapi saya mengerti maksud Anda. - Smudge


Jawaban:


Anda bukan orang bodoh. Menggunakan git sebagai mekanisme cadangan dapat menarik, dan meskipun apa yang orang lain katakan, git bekerja dengan baik dengan file biner. Baca baca halaman ini dari Git Book untuk informasi lebih lanjut tentang topik ini. Pada dasarnya, sejak itu git tidak menggunakan mekanisme penyimpanan delta, itu tidak terlalu peduli apa file Anda terlihat seperti (tetapi utilitas dari git diff cukup rendah untuk file biner dengan konfigurasi stok).

Masalah terbesar dengan menggunakan git untuk cadangan adalah bahwa hal itu tidak mempertahankan sebagian besar metadata filesystem. Secara khusus, git tidak merekam:

  • grup file
  • pemilik file
  • hak akses file (selain "apakah ini dapat dieksekusi")
  • atribut diperluas

Anda dapat menyelesaikan ini dengan menulis alat untuk mencatat informasi ini secara eksplisit ke dalam repositori Anda, tetapi itu bisa menjadi rumit untuk mendapatkan hak ini.

Pencarian Google untuk git metadata cadangan menghasilkan sejumlah hasil yang tampaknya layak dibaca (termasuk beberapa alat yang sudah berusaha untuk mengkompensasi masalah yang saya ajukan di sini).

dllkeeper dikembangkan untuk membuat cadangan /etc dan memecahkan banyak masalah ini.


78
2017-12-15 17:25



+1 untuk menyebutkan ACL / izin - Larry Silverman
Git juga tidak menyimpan direktori kosong. - Flimm
dan itu juga menyebalkan untuk melacak pemindahan / penggantian nama file, melalui sejarah. - cregox
Karena git tidak berhubungan dengan file biner dengan sangat baik, Anda mungkin juga ingin melihatnya git annex, yang membantu melakukannya dengan lebih baik. Itu memang mengubah gagasan tentang apa itu git. - Wouter Verhelst
pendapat saya adalah bahwa Anda dapat menggunakan git untuk membuat cadangan data tetapi tidak seluruh server - EKanadily


Saya belum menggunakannya, tetapi Anda mungkin melihatnya bup yang merupakan alat cadangan berdasarkan git.


20
2017-12-15 13:27



Pernah melihat bup sebelumnya, terlihat menarik - Smudge
Saya sudah mulai menggunakan bup baru-baru ini, hanya beberapa hari sebelum hard drive saya jatuh;) Kembalikan pergi baik-baik saja, sangat dianjurkan! - André Paramés
@ AndréParamés jadi apa yang Anda katakan adalah setelah Anda menginstal bup hard drive Anda jatuh ... mmmmhh ... :) hanya bercanda - hofnarwillie


Ini bisa menjadi solusi cadangan yang valid, dll penjaga didasarkan pada ide ini. Tapi awasi terus .git izin direktori jika tidak mendorong /etc/shadow dapat dibaca di .git direktori.


12
2017-12-15 12:18





Sementara secara teknis Anda bisa melakukan ini, saya akan menaruh dua peringatan terhadapnya:

1, Anda menggunakan sistem kontrol versi sumber untuk data biner. Karena itu Anda menggunakannya untuk sesuatu yang tidak dirancang untuk.

2, saya khawatir tentang proses pengembangan Anda jika Anda tidak memiliki proses (dokumentasi atau otomatis) untuk membangun mesin baru. Bagaimana jika Anda tertabrak membeli bus, siapa yang tahu apa yang harus dilakukan dan apa yang penting?

Pemulihan bencana penting, namun lebih baik untuk mengotomatiskan (skrip) penyiapan kotak pengembangan baru daripada hanya mencadangkan semuanya. Tentu gunakan git untuk skrip / dokumentasi Anda tetapi tidak untuk setiap file di komputer.


11
2017-12-15 13:45



Kotak pengembangan semua berasal dari file KickStart, dan sebenarnya kotak rata-rata berlangsung selama sekitar 2 atau 3 bulan sebelum dibangun kembali. Tetapi orang-orang mengubah konfigurasi dan melakukan berbagai hal, kami membangun kembali kotak-kotak itu dan orang-orang berkata, "Hei, saya tahu saya tidak memasukkannya ke dalam kontrol sumber, tetapi saya memiliki beberapa omong kosong di kotak itu" dan saya menertawakan mereka karena bodoh. Di sekitar, saat-saat baik. Data biner akan menyebalkan, itu adalah sesuatu yang benar-benar diabaikan saat mandi. - Smudge
Saya salut sikap Anda kepada mereka yang gagal mengikuti prinsip dasar. Secara pribadi saya memiliki situasi yang serupa dengan Anda, namun saya memiliki repositori git yang menghubungkan semua file konfigurasi yang mungkin penting daripada menangkap semuanya. Ditambah dokumen txt dengan langkah penyiapan. - Phil Hannent
Saya pikir git bekerja cukup baik untuk file biner, bagian terbesar dari repo Google AdWords adalah repositori git dari executable prebuilt. - user377178


Saya menggunakan git sebagai cadangan untuk sistem Windows saya, dan itu sangat berguna. Di bagian bawah posting, saya menunjukkan skrip yang saya gunakan untuk mengkonfigurasi pada sistem Windows. Menggunakan git sebagai cadangan untuk sistem apa pun menyediakan 2 keuntungan besar:

  1. Tidak seperti solusi komersial sering menggunakan format kepemilikan mereka sendiri, cadangan Anda dalam format open source yang didukung secara luas dan didokumentasikan dengan sangat baik. Ini memberi Anda kontrol penuh atas data Anda. Sangat mudah untuk melihat file mana yang berubah dan kapan. Jika Anda ingin memotong sejarah Anda, Anda dapat melakukannya juga. Ingin melenyapkan sesuatu dari sejarah Anda? Tidak masalah. Mendapatkan kembali versi file Anda sesederhana perintah git apa pun.
  2. Banyak atau beberapa cermin yang Anda inginkan, dan semua dapat disesuaikan waktu cadangan. Anda akan mendapatkan mirror lokal Anda, yang tidak terbebani oleh lalu lintas Internet yang lambat, dan dengan demikian memberi Anda (1) kemampuan untuk melakukan backup lebih sering sepanjang hari dan (2) waktu pemulihan yang cepat. (Seringnya backup merupakan nilai tambah yang besar, karena saya menemukan waktu terbanyak saya kehilangan dokumen adalah karena kesalahan pengguna. Misalnya, anak Anda secara tidak sengaja menimpa dokumen yang telah dia kerjakan selama 5 jam terakhir.) Tetapi Anda akan mendapatkan cermin jarak jauh, yang memberikan keuntungan perlindungan data jika terjadi bencana atau pencurian lokal. Dan misalkan Anda ingin mirror remote Anda mendukung pada waktu yang disesuaikan untuk menghemat bandwidth Internet Anda? Tidak masalah.

Intinya: Pencadangan git memberi Anda kekuatan luar biasa dalam mengendalikan cara pencadangan dilakukan.

Saya mengkonfigurasi ini pada sistem Windows saya. Langkah pertama adalah membuat git repo lokal di mana Anda akan melakukan semua data lokal Anda. Saya sarankan menggunakan hard drive kedua lokal, tetapi menggunakan harddrive yang sama akan berfungsi (tetapi diharapkan Anda akan mendorong remote di suatu tempat ini, atau jika Anda mengacaukannya jika harddisk tersebut mati.)

Pertama Anda harus menginstal cygwin (dengan rsync), dan juga menginstal git untuk Windows: http://git-scm.com/download/win

Selanjutnya, buat git repo lokal Anda (hanya dijalankan satu kali):

init-repo.bat:

@echo off
REM SCRIPT PURPOSE: CREATE YOUR LOCAL GIT-REPO (RUN ONLY ONCE)

REM Set where the git repository will be stored
SET GBKUP_LOCAL_MIRROR_HOME=E:\backup\mirror


REM Create the backup git repo. 
SET GIT_PARAMS=--git-dir=%GBKUP_LOCAL_MIRROR_HOME%\.git --work-tree=%GBKUP_LOCAL_MIRROR_HOME% 
mkdir %GBKUP_LOCAL_MIRROR_HOME%
git %GIT_PARAMS% init
git %GIT_PARAMS% config core.autocrlf false
git %GIT_PARAMS% config core.ignorecase false 
git %GIT_PARAMS% config core.fileMode false
git %GIT_PARAMS% config user.email backup@yourComputerName
git %GIT_PARAMS% config user.name backup

REM add a remote to the git repo.  Make sure you have set myRemoteServer in ~/.ssh/config   
REM The path on the remote server will vary.  Our remote server is a Windows machine running cygwin+ssh.  
REM For better security, you could install gitolite on the remote server, and forbid any non-fast-forward merges, and thus stop a malicious user from overwriting your backups.
git %GIT_PARAMS% remote add origin myRemoteServer:/cygdrive/c/backup/yourComputerName.git

REM treat all files as binary; so you don't have to worry about autocrlf changing your line endings
SET ATTRIBUTES_FILE=%GBKUP_LOCAL_MIRROR_HOME%\.git\info\attributes
echo.>> %ATTRIBUTES_FILE% 
echo *.gbkuptest text>> %ATTRIBUTES_FILE% 
echo * binary>> %ATTRIBUTES_FILE% 
REM compression is often a waste of time with binary files
echo * -delta>> %ATTRIBUTES_FILE% 
REM You may need to get rid of windows new lines. We use cygwin's tool
C:\cygwin64\bin\dos2unix %ATTRIBUTES_FILE%

Selanjutnya, kami memiliki wrapper skrip backup kami, yang akan dipanggil secara teratur oleh Windows Scheduler:

gbackup.vbs:

' A simple vbs wrapper to run your bat file in the background
Set oShell = CreateObject ("Wscript.Shell") 
Dim strArgs
strArgs = "cmd /c C:\opt\gbackup\gbackup.bat"
oShell.Run strArgs, 0, false

Selanjutnya, kami memiliki skrip cadangan itu sendiri yang pembungkus panggilannya:

gbackup.bat:

    @echo off

REM Set where the git repository will be stored
SET GBKUP_LOCAL_MIRROR_HOME=E:\backup\mirror
REM the user which runs the scheduler
SET GBKUP_RUN_AS_USER=yourWindowsUserName
REM exclude file
SET GBKUP_EXCLUDE_FILE=/cygdrive/c/opt/gbackup/exclude-from.txt

SET GBKUP_TMP_GIT_DIR_NAME=git-renamed
for /f "delims=" %%i in ('C:\cygwin64\bin\cygpath %GBKUP_LOCAL_MIRROR_HOME%') do set GBKUP_LOCAL_MIRROR_CYGWIN=%%i

REM rename any .git directories as they were (see below command)
for /r %GBKUP_LOCAL_MIRROR_HOME% %%i in (%GBKUP_TMP_GIT_DIR_NAME%) do ren "%%i" ".git" 2> nul

SET RSYNC_CMD_BASE=C:\cygwin64\bin\rsync -ahv --progress --delete --exclude-from %GBKUP_EXCLUDE_FILE%

REM rsync all needed directories to local mirror
%RSYNC_CMD_BASE% /cygdrive/c/dev %GBKUP_LOCAL_MIRROR_CYGWIN%
%RSYNC_CMD_BASE% /cygdrive/c/Users/asmith %GBKUP_LOCAL_MIRROR_CYGWIN%
%RSYNC_CMD_BASE% /cygdrive/c/Users/bsmith %GBKUP_LOCAL_MIRROR_CYGWIN%

cacls %GBKUP_LOCAL_MIRROR_HOME% /t /e /p  %GBKUP_RUN_AS_USER%:f

REM rename any .git directories as git will ignore the entire directory, except the main one
for /r %GBKUP_LOCAL_MIRROR_HOME% %%i in (.git) do ren "%%i" "%GBKUP_TMP_GIT_DIR_NAME%" 2> nul
ren %GBKUP_LOCAL_MIRROR_HOME%\%GBKUP_TMP_GIT_DIR_NAME% .git

REM finally commit to git
SET GIT_PARAMS=--git-dir=%GBKUP_LOCAL_MIRROR_HOME%\.git --work-tree=%GBKUP_LOCAL_MIRROR_HOME% 
SET BKUP_LOG_FILE=%TMP%\git-backup.log
SET TO_LOG=1^>^> %BKUP_LOG_FILE% 2^>^&1
echo ===========================BACKUP START=========================== %TO_LOG%
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a%%b)
echo %mydate%_%mytime% %TO_LOG%
echo updating git index, committing, and then pushing to remote %TO_LOG%
REM Caution: The --ignore-errors directive tells git to continue even if it can't access a file.
git %GIT_PARAMS% add -Av --ignore-errors %TO_LOG%
git %GIT_PARAMS% commit -m "backup" %TO_LOG%
git %GIT_PARAMS% push -vv --progress origin master %TO_LOG%
echo ===========================BACKUP END=========================== %TO_LOG%

Kami memiliki file exclude-from.txt, di mana kami meletakkan semua file untuk diabaikan:

exclude-from.txt:

target/
logs/
AppData/
Downloads/
trash/
temp/
.idea/
.m2/
.IntelliJIdea14/
OLD/
Searches/
Videos/
NTUSER.DAT*
ntuser.dat*

Anda harus pergi ke sembarang repositori jarak jauh dan melakukan 'git init --bare' pada mereka. Anda dapat menguji skrip dengan menjalankan skrip cadangan. Dengan asumsi semuanya berfungsi, buka Windows Scheduler dan arahkan pencadangan per jam ke file vbs. Setelah itu, Anda akan memiliki sejarah git komputer Anda untuk setiap jam. Ini sangat nyaman - setiap tidak sengaja menghapus bagian teks dan melewatkannya? Cukup periksa repositori git Anda.


6
2018-03-21 17:10



Hanya ingin tahu - apakah itu akan bekerja juga untuk drive jaringan lambat atau non-standar, seperti yang diemulasi oleh NetDrive atau Expandrive? Saya menemukan sebagian besar perangkat lunak cadangan gagal dengan drive jaringan ini. Juga hal-hal menjadi sangat lambat dan cenderung time-out, jika saya ingin daftar semua file dalam cadangan dan ekstrak file individual. Apakah git mampu memecahkan masalah ini? - JustAMartin
@JustAMartin Saya belum pernah mengujinya di drive jaringan, jadi saya tidak bisa mengatakannya. Setelah Anda mendapatkan file IN a git repo, git sangat efisien. - user64141


Yah itu bukan ide yang buruk, tapi saya pikir ada 2 bendera merah untuk dibangkitkan:

  • Jika harddisk gagal, Anda akan kehilangan segalanya jika Anda tidak mendorong komitmen Anda ke server / drive lain. (Event jika Anda punya rencana untuk itu, saya lebih suka menyebutkan.)

... tapi tetap saja, itu bisa menjadi cadangan yang baik untuk hal-hal terkait korupsi. Atau seperti yang Anda katakan, jika .git / folder ada di tempat lain.

  • Cadangan ini akan selalu bertambah besar ukurannya. Tidak ada pemangkasan atau rotasi atau apa pun secara default.

... Jadi Anda mungkin perlu memberi tahu cronjob Anda untuk menambahkan tag, dan kemudian pastikan commit yang tidak ditandai akan dibersihkan.


4
2017-12-15 13:40



Kami mungkin akan me-mount direktori git pada server jauh, meskipun clasic rm -Rf / akan menyebabkan kita beberapa masalah. Sistem cadangan kami saat ini menyimpan barang-barang untuk 2 tahun atau 50 versi (yang mana yang terakhir) sehingga cadangan kami terus meningkat. Tapi saya suka ide menambahkan tag, kita bisa memiliki tag "harian", "mingguan" dll - Smudge
+1 untuk kebutuhan ruang yang terus berkembang - hafichuk
@sam git terus berkembang. Anda tidak bisa memangkas sejarah yang lebih tua dari N tahun. Saya kira sistem Anda saat ini. - rds
Mengenai peningkatan ukuran, silakan lakukan 'git gc' secara teratur atau sebelum Anda menekan ke server (tengah) lain. Tanpa ini, git repo dapat tumbuh (jauh) lebih besar dari seharusnya. Saya pernah memiliki git repo 346 MB yang dapat menyusut menjadi 16 MB. - Hendy Irawan


Saya belum mencobanya dengan sistem penuh tetapi saya menggunakannya untuk backup MySQL saya (dengan opsi --skip-extended-insert) dan itu benar-benar bekerja dengan baik untuk saya.

Anda akan mengalami masalah dengan file data biner (seluruh isi mereka bisa dan akan berubah) dan Anda mungkin memiliki masalah dengan .git folder menjadi sangat besar. Saya akan merekomendasikan pengaturan a .gitignore file dan hanya mencadangkan file teks yang benar-benar Anda perlukan.


3
2017-12-15 13:23



Saya menggunakannya untuk backup MySQL juga, dengan --extended-insert = false. Pastikan untuk "git gc" secara teratur atau tepat setelah melakukan. - Hendy Irawan
Lihat Apakah mem-backup database MySQL di Git ide yang bagus? - Michael Hampton♦


Saya pernah mengembangkan solusi cadangan berdasarkan subversi. Meskipun bekerja cukup baik (dan git seharusnya bekerja lebih baik), saya rasa ada solusi yang lebih baik di sini.

saya mempertimbangkan rsnapshot menjadi salah satu yang lebih baik - jika tidak itu lebih baik. Dengan penggunaan tautan keras yang baik, saya memiliki file server 300 GB (dengan setengah juta file) dengan cadangan harian, mingguan, dan bulanan akan kembali sejauh satu tahun. Total ruang disk yang digunakan hanya satu salinan lengkap + bagian tambahan dari setiap cadangan, tetapi berkat tautan keras yang saya miliki lengkap struktur direktori "live" di masing-masing backup. Dengan kata lain, file dapat diakses secara langsung tidak hanya di bawah daily.0 (cadangan terbaru), tetapi bahkan dalam daily.1 (yestarday) atau weekly.2 (dua minggu yang lalu), dan seterusnya.

Membagi ulang folder cadangan dengan Samba, pengguna saya dapat menarik file dari cadangan hanya dengan mengarahkan PC mereka ke server cadangan.

Pilihan lain yang sangat bagus adalah rdiff-backup, tetapi karena saya ingin memiliki file selalu dapat diakses hanya dengan menuju Explorer ke \\ servername, rsnapshot adalah solusi yang lebih baik untuk saya.


3
2018-03-21 20:01



Rilis terakhir dari rdiff-backup adalah dari 2009. Apakah itu dirancang dengan sangat baik dan tidak memerlukan pembaruan sama sekali atau hanya sebuah proyek yang terbengkalai? - Mateusz Konieczny
Saya tidak tahu apakah itu maitained, tetapi pada dasarnya "selesai". - shodanshok
Dari melihat savannah.nongnu.org/bugs/… tampaknya ada beberapa aktivitas hingga akhir 2015 tetapi banyak laporan bug diabaikan. Saya pikir saya akan mengklasifikasikannya sebagai orang yang ditinggalkan. - Mateusz Konieczny


Saya memiliki ide yang sama untuk mencadangkan dengan git, pada dasarnya karena ini memungkinkan backup berversi. Lalu saya melihat rdiff-backup, yang menyediakan fungsionalitas itu (dan banyak lagi). Ini memiliki antarmuka pengguna yang sangat bagus (lihat pada opsi CLI). Saya cukup senang dengan itu. Itu --remove-older-than 2W cukup keren. Ini memungkinkan Anda menghapus versi yang lebih lama dari 2 minggu. rdiff-backup toko hanya diffs file.


2
2017-12-15 18:07





Saya sangat baru untuk git, tetapi bukan cabang lokal secara default, dan harus didorong secara eksplisit ke repositori jarak jauh? Ini adalah kejutan yang tidak menyenangkan dan tidak terduga. Lagi pula, tidak saya inginkan semua dari repo lokal saya untuk 'mundur' ke server? Membaca buku git:

Cabang lokal Anda tidak disinkronkan secara otomatis ke remote yang Anda tulis - Anda harus secara eksplisit mendorong cabang yang ingin Anda bagikan. Dengan begitu, Anda dapat menggunakan cabang pribadi untuk bekerja yang tidak ingin Anda bagikan, dan dorong hanya cabang topik yang ingin Anda ajak berkolaborasi.

Bagi saya ini berarti bahwa cabang-cabang lokal, seperti file-file non-git lain pada mesin lokal saya, beresiko hilang kecuali dicadangkan secara teratur oleh beberapa alat non-git. Bagaimanapun juga saya melakukan ini, tetapi itu mematahkan asumsi saya tentang git 'mencadangkan semuanya' dalam repo saya. Saya ingin klarifikasi tentang ini!


2
2018-03-06 13:22



Hampir semua hal tentang git dengan pengecualian remote adalah lokal. Yaitu dengan desain. Anda dapat mendorong hal-hal ke remote, dan seharusnya, terutama jika digunakan untuk cadangan seperti dalam skenario ini. Untuk cabang lagi, ya, Anda perlu mendorongnya secara eksplisit jika Anda ingin menambahkannya ke remote. Untuk pengembangan, ini bagus karena sering kali Anda ingin menguji sesuatu, tetapi tidak perlu cabang uji itu dipertahankan tanpa batas. Setelah Anda memiliki apa yang Anda butuhkan darinya, Anda mungkin akan menggabungkannya ke cabang dev dan del cabang uji. - LocalPCGuy


Saya menemukan ini menjadi metodologi yang baik untuk kotak dev saya. Ini mengubah mereka dari sesuatu yang harus didukung hanya titik akhir penyebaran.

Semua manifes konfigurasi dan instalasi paket disimpan dalam Wayang, memungkinkan untuk pemutakhiran mudah dan pembaruan konfigurasi. Direktori Wayang didukung dengan git. Kickstart digunakan untuk melakukan penyebaran awal.

Saya juga menyimpan repositori YUM khusus untuk paket apa saja yang sedang dikembangkan saat itu. Ini memiliki manfaat tambahan bahwa paket apa pun yang kita kerjakan tidak hanya dibiarkan sebagai binari yang tidak dijaga pada sistem lokal - jika itu terjadi dan file-file bisa di-nuked oh well. Seseorang tidak mengikuti prosedur yang benar.


1
2017-12-15 14:47