Я використовую git як резервну копію для своєї системи Windows, і це було надзвичайно корисно. У нижній частині публікації я показую сценарії, які використовую для налаштування в системі Windows. Використання git як резервного копіювання для будь-якої системи забезпечує 2 великі переваги:
- На відміну від комерційних рішень часто використовують власний фірмовий формат, ваша резервна копія знаходиться у форматі з відкритим кодом, який широко підтримується і дуже добре задокументований. Це дає вам повний контроль над своїми даними. Дуже легко зрозуміти, які файли змінилися і коли. Якщо ви хочете обрізати свою історію, ви також можете це зробити. Хочете видалити щось із своєї історії? Нема проблем. Повернення версії файлу назад так само просто, як і будь-яка команда git.
- Стільки дзеркал, скільки ви хочете, і всі можуть настроювати час резервного копіювання. Ви отримаєте своє місцеве дзеркало, яке не обтяжене повільним інтернет-трафіком, і таким чином дає вам (1) можливість робити частіші резервні копії протягом дня та (2) швидкий час відновлення. (Часті резервні копії - це величезний плюс, тому що я вважаю, що найбільше часу втрачаю документ - це помилка користувача. Наприклад, ваша дитина випадково перезаписав документ, над яким працював останні 5 годин.) Але ви отримаєте свій віддалене дзеркало, яке дає перевагу захисту даних у разі локальної катастрофи або крадіжки. І припустимо, ви хочете створити резервну копію віддаленого дзеркала в індивідуальний час, щоб зберегти Інтернет-пропускну здатність? Нема проблем.
Підсумок: Резервне копіювання git дає вам неймовірні можливості контролювати, як відбуваються ваші резервні копії.
Я налаштував це в своїй системі Windows. Перший крок - створити локальну git repo, де ви будете вносити всі свої локальні дані. Я рекомендую використовувати локальний другий жорсткий диск, але використовувати той же жорсткий диск буде працювати (але, як очікується, ви натиснете це кудись віддалено, або інакше ваш гвинт, якщо жорсткий диск помре.)
Спочатку потрібно встановити cygwin (з rsync), а також встановити git для Windows: http://git-scm.com/download/win
Далі створіть локальне git repo (запускається лише один раз):
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%
Далі, ми маємо нашу резервну скрипку для резервного копіювання, яку регулярно буде викликати Планувальник Windows:
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
Далі ми маємо сам резервний скрипт, який загортає:
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%
У нас є файл виключення-from.txt, де ми ставимо всі файли для ігнорування:
виключити-з.txt:
target/
logs/
AppData/
Downloads/
trash/
temp/
.idea/
.m2/
.IntelliJIdea14/
OLD/
Searches/
Videos/
NTUSER.DAT*
ntuser.dat*
Вам потрібно буде перейти до будь-яких віддалених репостів і зробити на них "git init --bare". Ви можете протестувати сценарій, виконавши резервний сценарій. Припускаючи, що все працює, перейдіть до Планувальника Windows і наведіть годинну резервну копію у бік файлу vbs. Після цього ви будете мати історію git свого комп'ютера протягом кожної години. Це надзвичайно зручно - кожен випадково видалити фрагмент тексту і пропустити його? Просто перевірте своє сховище git.