GIT 作为备份工具

Smu*_*dge 115 backup git

在服务器上,安装 git

cd /
git init
git add .
git commit -a -m "Yes, this is server"
Run Code Online (Sandbox Code Playgroud)

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

对于不重要的开发服务器,我不希望在适当的备份系统上设置它的麻烦/成本,并且备份只是为了方便(即我们不需要备份该服务器,但它会节省如果出现问题,有一段时间),这可能是一个有效的备份解决方案,还是会倒在一大堆便便中?

lar*_*sks 100

你不是傻子。使用git作为备份机制可以是有吸引力的,尽管有什么其他人说,git工程的二进制文件就好了。阅读Git Book 中的此页面以获取有关此主题的更多信息。基本上,因为git没有使用增量存储机制,它并没有真正关心什么文件看起来像(但效用git diff是相当低的二进制文件与股票配置)。

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

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

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

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

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

  • Git 也不存储空目录。 (27认同)
  • +1 提及 ACL/权限 (20认同)

ste*_*tew 26

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

  • 我最近开始使用 bup,就在我的硬盘崩溃前几天;) 恢复正常,所以推荐! (2认同)

Sto*_*one 12

它可以是一个有效的备份解决方案,etckeeper 就是基于这个想法。但是请注意.git目录权限,否则在目录/etc/shadow中可以读取推送.git


Phi*_*ent 12

虽然从技术上讲你可以做到这一点,但我会提出两个警告:

1,您正在使用二进制数据的源版本控制系统。因此,您将它用于它不是为之设计的东西。

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

灾难恢复很重要,但是自动化(脚本化)新开发盒的设置比只备份所有内容更好。当然,将 git 用于您的脚本/文档,但不是用于计算机上的每个文件。

  • 开发箱全部来自 KickStart 文件,实际上平均箱在重新构建之前持续大约 2 或 3 个月。但是人们改变配置并做一些事情,我们重新构建盒子,人们说“嘿,我知道我没有把它放在源代码控制中,但我在那个盒子上有一些东西”,我嘲笑他们愚蠢。到处都是,美好的时光。二进制数据会是个婊子,这是我在淋浴时完全忽略的东西。 (5认同)
  • 我认为 git 适用于二进制文件,谷歌 Android 的大部分 repo 是预建可执行文件的 git 存储库。 (2认同)

use*_*141 7

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

  1. 与通常使用自己专有格式的商业解决方案不同,您的备份采用开源格式,该格式受到广泛支持且文档齐全。这使您可以完全控制您的数据。很容易查看哪些文件发生了变化以及何时发生了变化。如果你想截断你的历史,你也可以这样做。想从你的历史中抹去一些东西吗?没问题。获取文件的一个版本就像任何 git 命令一样简单。
  2. 您想要多少镜像就多少,而且所有镜像都可以自定义备份时间。您将获得本地镜像,它不受缓慢的 Internet 流量的影响,从而使您 (1) 能够全天进行更频繁的备份,以及 (2) 快速恢复时间。(频繁备份是一个巨大的优势,因为我发现我丢失文档的最多时间是由于用户错误。例如,您的孩子不小心覆盖了他过去 5 个小时一直在处理的文档。)但是您会得到您的远程镜像,可在发生本地灾难或盗窃时提供数据保护优势。假设您希望在自定义时间备份远程镜像以节省 Internet 带宽?没问题。

底线: git 备份为您提供了控制备份发生方式的不可思议的力量。

我在我的 Windows 系统上配置了这个。第一步是创建本地 git 存储库,您将在其中提交所有本地数据。我建议使用本地的第二个硬盘驱动器,但使用相同的硬盘驱动器也可以(但预计您会将其推到远程的某个地方,否则如果硬盘驱动器死机,您就会搞砸。)

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

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

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%
Run Code Online (Sandbox Code Playgroud)

接下来,我们有我们的备份脚本包装器,它将被 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
Run Code Online (Sandbox Code Playgroud)

接下来,我们有包装器调用的备份脚本本身:

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%
Run Code Online (Sandbox Code Playgroud)

我们有 exclude-from.txt 文件,我们把所有文件都放在那里忽略:

排除-from.txt:

target/
logs/
AppData/
Downloads/
trash/
temp/
.idea/
.m2/
.IntelliJIdea14/
OLD/
Searches/
Videos/
NTUSER.DAT*
ntuser.dat*
Run Code Online (Sandbox Code Playgroud)

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


FMa*_*008 5

嗯,这不是一个坏主意,但我认为有两个危险信号需要提出:

  • 如果硬盘出现故障,如果您不将提交推送到另一个服务器/驱动器,您将失去一切。(如果你有计划,我更愿意提及。)

...但是,它仍然可以成为与腐败相关的事情的良好备份。或者就像你说的,如果 .git/ 文件夹在其他地方。

  • 此备份的大小将始终增加。默认情况下没有修剪或旋转或任何东西。

... 所以你可能需要告诉你的 cronjob 添加标签,然后确保未标记的提交将被清理。