GIT 作为备份工具

GIT 作为备份工具

在服务器上安装 git

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

然后/.git/指向网络驱动器(SAN、NFS、Samba 等)或其他磁盘。每小时/每天等使用 cron 作业来更新更改。.git 目录将包含所有服务器文件的版本副本(不包括无用/复杂的文件,如 /proc、/dev 等)。

对于一个不重要的开发服务器,我不想花费精力/成本去设置一个合适的备份系统,而且备份只是为了方便(即我们不需要需要备份该服务器(但如果出现问题,它可以节省一些时间),这可能是一个有效的备份解决方案,还是会落入一堆废物中?

答案1

你不是个傻瓜。用作git备份机制很有吸引力,而且不管其他人怎么说,git二进制文件也能很好地工作。阅读此页面来自 Git Book有关此主题的更多信息。基本上,由于git不使用增量存储机制,因此它并不关心什么git diff您的文件看起来像(但对于具有库存配置的二进制文件来说,实用性相当低)。

使用备份的最大问题git是它不保留大多数文件系统元数据。具体来说,git不记录:

  • 文件组
  • 文件所有者
  • 文件权限(除了“这是可执行文件吗”)
  • 扩展属性

您可以通过编写工具将此信息明确地记录到您的存储库中来解决此问题,但要做到这一点可能很棘手。

谷歌搜索git 备份元数据产生了许多值得一读的结果(包括一些已经尝试弥补我在这里提出的问题的工具)。

etckeeper是为备份而开发的/etc,它解决了许多这些问题。

答案2

我没有用过,但你可以看看布普这是一个基于git的备份工具。

答案3

虽然从技术上来说你可以这样做,但我想提出两点警告:

1,您正在使用二进制数据的源版本控制系统。因此,您正在将其用于其设计目的之外的事情。

2,如果你没有构建新机器的流程(文档或自动化),我会担心你的开发过程。如果你被一辆公共汽车撞了怎么办,谁知道该做什么,什么是重要的?

灾难恢复很重要,但自动化(编写脚本)新开发箱的设置比备份所有内容更好。当然,可以使用 git 来备份脚本/文档,但不要备份计算机上的每个文件。

答案4

我使用 git 作为 Windows 系统的备份,它非常有用。在文章的底部,我展示了我在 Windows 系统上配置时使用的脚本。使用 git 作为任何系统的备份都有两大优势:

  1. 与通常使用其专有格式的商业解决方案不同,您的备份采用开源格式,该格式受到广泛支持且文档齐全。这让您可以完全控制数据。您可以非常轻松地查看哪些文件发生了更改以及更改时间。如果您想截断历史记录,也可以这样做。想从历史记录中删除某些内容?没问题。恢复文件版本就像任何 git 命令一样简单。
  2. 您可以根据需要设置任意数量的镜像,并且所有镜像都可以自定义备份时间。您将获得本地镜像,它不受缓慢的互联网流量的影响,因此 (1) 您可以在一天内更频繁地进行备份,并且 (2) 恢复时间更短。(频繁备份是一个巨大的优势,因为我发现丢失文档的大部分原因是用户错误。例如,您的孩子不小心覆盖了他过去 5 个小时一直在处理的文档。)但是您将获得远程镜像,它具有在发生本地灾难或盗窃时保护数据的优势。假设您希望远程镜像在自定义时间备份以节省互联网带宽?没问题。

底线:git 备份为您提供了极大的权力来控制备份的发生方式。

我在 Windows 系统上配置了此功能。第一步是创建本地 git repo,您​​将向其中提交所有本地数据。我建议使用本地第二个硬盘,但使用同一个硬盘也可以(但预计您会将其推送到远程某个地方,否则如果硬盘坏了,您就完蛋了。)

您首先需要安装 cygwin (带有 rsync),还需要安装适用于 Windows 的 git:http://git-scm.com/download/win

接下来,创建您的本地 git repo(仅运行一次):

初始化-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 Scheduler 定期调用:

备份.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%

我们有 exclude-from.txt 文件,其中放置了所有要忽略的文件:

排除-from.txt:

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

您需要转到任何远程存储库并对其执行“git init --bare”。您可以通过执行备份脚本来测试脚本。假设一切正常,请转到 Windows Scheduler 并将每小时备份指向 vbs 文件。之后,您将获得每小时的计算机 git 历史记录。这非常方便——每次不小心删除一段文本并错过它?只需检查您的 git 存储库。

相关内容