GIT作为备份工具


101

在服务器上,安装git

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

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

对于不重要的开发服务器,我不希望在适当的备份系统上进行设置的麻烦/成本,并且备份只是为了方便(IE,我们不需要备份此服务器,但是这样做可以节省如果出现问题,请等待一段时间),这可能是一个有效的备份解决方案,还是会大跌眼镜?


3
不会使用类似的想法来分享吗?
B14D3 2011年

@ B14D3我认为sparkleshare更像是一个保管箱类型的东西,但我会研究一下
涂抹

2
您是对的,但是它使用git来制作某种buckup事情(复制到几台PC并控制文件的版本);)
B14D3 2011年

最大的问题是没有中央控制-您需要直接(ssh)访问计算机以执行任何形式的维护或备份验证。我总是发现在要备份的盒子上安装一个应用程序,然后从中央位置进行管理是一个更大的胜利。
hafichuk

@hafichuk使用Puppet / Chef之类的工具并不是什么大问题,但我明白你的意思。
涂抹

Answers:


88

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

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

  • 文件组
  • 档案拥有者
  • 文件权限(“此可执行文件除外”)
  • 扩展属性

您可以通过编写工具将这些信息显式记录到存储库中来解决此问题,但是正确实现它可能很棘手。

Google搜索git backup元数据会产生许多值得阅读的结果(包括一些已经在尝试弥补我在此处提出的问题的工具)。

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


15
+1提及ACL /权限
Larry Silverman '12

22
Git也不会存储空目录。
Flimm

而且它还很烂,无法跟踪历史记录中的文件移动/重命名。
cregox

1
由于git不能很好地处理二进制文件,因此您可能还需要研究git annex,这有助于更好地做到这一点。但是,它确实改变了git是什么的想法。
Wouter Verhelst,2015年

1
我的意见是,您可以使用git来备份数据,但不能备份整个服务器
EKanadily

21

我没有使用过,但是您可能会看bup,它是基于git的备份工具。


以前从未见过bup,看起来很有趣
涂抹

1
我最近刚开始使用bup,就在硬盘崩溃前几天;)恢复正常,因此建议!
2011年

1
@AndréParamés,所以您要说的是刚安装完bup后硬盘驱动器崩溃了……mmmmhh ... :)开玩笑
hofnarwillie 2016年

12

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


11

从技术上讲,您可以做到这一点,但我要提出两个警告:

1,您正在使用源版本控制系统来处理二进制数据。因此,您正在将其用于并非设计用于的用途。

2,如果您没有构建新机器的过程(文档或自动化的),我担心您的开发过程。如果您遇到了麻烦,那就买一辆公共汽车,谁会知道该怎么办,什么才是重要的呢?

灾难恢复很重要,但是自动化(开发脚本)新开发箱的安装比备份所有内容要好。确保将git用于您的脚本/文档,但不用于计算机上的每个文件。


4
开发箱全部来自KickStart文件,实际上,平均箱在重建之前要持续约2到3个月。但是人们改变了配置并执行了一些操作,我们重新构建了盒子,人们说“嘿,我知道我没有将它放在源代码控制中,但是我在盒子上有些烂”,我为它们的愚蠢而嘲笑。到处都是美好的时光。二进制数据将是一个bit子,这在淋浴时我完全被忽略了。
涂抹

我赞扬您对那些不遵守基本原则的人的态度。就个人而言,我的情况与您类似,但是我有一个git存储库,该存储库链接了所有重要的配置文件,而不是全部。加上带有设置步骤的txt文档。
Phil Hannent 2011年

1
我认为git对于二进制文件非常有效,而Google Android仓库的大部分是预构建可执行文件的git存储库。
user377178

6

我将git用作Windows系统的备份,它非常有用。在文章的底部,我显示了用于在Windows系统上配置的脚本。将git用作任何系统的备份有两个主要优点:

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

底线:git备份为您提供了控制备份方式的强大功能。

我在Windows系统上进行了配置。第一步是创建本地git repo,您​​将在其中提交所有本地数据。我建议使用本地第二块硬盘驱动器,但是可以使用同一块硬盘驱动器(但是,您可以将其推到远程某个地方,否则,如果硬盘驱动器死了,则将其拧紧。)

您首先需要安装cygwin(使用rsync),还需要为Windows安装git: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 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

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

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文件,在其中将所有文件都忽略:

exclude-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存储库即可。


只是好奇-它也适用于慢速或非标准的网络驱动器,例如NetDrive或Expandrive模拟的驱动器吗?我发现大多数备份软件都无法使用这些网络驱动器。如果我要列出备份中的所有文件并提取单个文件,事情也会变得非常缓慢,并且容易超时。git能够解决这些问题吗?
JustAMartin

@JustAMartin我从未在网络驱动器上对其进行过测试,所以我不能说。一旦您在git仓库中获取了文件,git就会非常高效。
user64141

4

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

  • 如果硬盘发生故障,如果不将提交推送到另一台服务器/驱动器,则将丢失所有内容。(如果您有计划的话,我想提一下。)

...但是,它仍然可以很好地备份与腐败相关的事情。或如您所说,如果.git /文件夹位于其他位置。

  • 此备份将始终增加大小。默认情况下,没有修剪或旋转或任何其他操作。

...因此,您可能需要告诉cronjob添加标签,然后确保将清除未标记的提交。


我们可能会将.git目录安装在远程服务器上,尽管经典rm -Rf /会导致一些问题。我们当前的备份系统可以保存2年或50个版本(以较早者为准),因此我们的备份无论如何都在不断增加。但是我喜欢添加标签的想法,我们可以使用“每日”,“每周”等标签
Smudge

+1以满足不断增长的空间需求
hafichuk 2011年

@sam git一直在增长。您可以删节超过N年的历史记录。我想您当前的系统可以。
rds

1
关于大小增加,请定期执行“ git gc”操作,或者在推送至另一台(中央)服务器之前执行。没有这个,git repo可能会增长(远远超过它应有的)。我曾经有一个346 MB的git存储库,可以缩小到16 MB。
Hendy Irawan 2012年

3

我还没有在完整的系统上尝试过它,但是我正在将它用于我的MySQL备份(带有--skip-extended-insert选项),它对我来说真的很好用。

您将遇到二进制数据文件的问题(它们的全部内容可能并且将发生变化),并且.git文件夹可能会变得非常大。我建议您设置一个.gitignore文件,只备份您真正知道自己需要的文本文件。


我也将它与--extended-insert = false一起用于MySQL备份。确保定期或在提交后立即“ git gc”。
Hendy Irawan 2012年


3

我曾经开发过基于Subversion的备份解决方案。虽然效果很好(并且git应该更好),但我认为这里有更好的解决方案。

我认为rsnapshot是的最好的一个-如果不是更好。充分利用了硬链接,我有了一个300 GB的文件服务器(带有半百万个文件),每天,每周和每月一次备份可以追溯到一年以前。总使用的磁盘空间仅是一个完整副本+每个备份的增量部分,但是由于有了硬链接,我在每个备份中都有完整的 “活动”目录结构。换句话说,文件不仅可以在daily.0(最新备份)下直接访问,甚至可以在daily.1(yestarday)或weekly.2(两个星期前)下直接访问,依此类推。

通过Samba重新共享备份文件夹,我的用户只需将PC指向备份服务器即可从备份中提取文件。

另一个非常好的选择是rdiff-backup,但是由于我希望始终通过将Explorer转到\\ servername来始终访问文件,因此rsnapshot对我来说是一个更好的解决方案。


rdiff-backup的最新版本是2009年。它设计得非常好,根本不需要更新吗?还是仅仅是一个废弃的项目?
Mateusz

我不知道这是不是真的,但是基本上是“完成”的。
shodanshok

通过查看savannah.nongnu.org/bugs/…,似乎有一些活动可以追溯到2015年,但是许多错误报告被忽略了。我想我会将其归类为废弃。
Mateusz Konieczny

2

我用git备份有相同的想法,基本上是因为它允许版本备份。然后,我看到了rdiff-backup,它提供了该功能(以及更多)。它有一个非常漂亮的用户界面(请查看CLI选项)。我对此感到非常满意。该--remove-older-than 2W是很酷。它允许您删除两个星期以上的版本。rdiff-backup仅存储文件差异。


2

我对git非常陌生,但是默认情况下分支不是本地分支,必须显式推送到远程存储库吗?这是令人不愉快和意外的惊喜。毕竟,我是否不希望将所有本地存储库“备份”到服务器?阅读git书

您的本地分支不会自动同步到您写入的远程服务器,而必须显式推送要共享的分支。这样,您可以将私人分支用于您不想共享的工作,并且仅上推您要协作的主题分支。

对我来说,这意味着那些本地分支(与我的本地计算机上的其他非git文件一样)有丢失的风险,除非以某种非git的方式定期备份。无论如何,我还是这样做,但这打破了我对git在仓库中“备份所有内容”的假设。我希望对此进行澄清!


1
关于git的几乎所有东西,除了遥控器,都是本地的。那是设计使然。您可以将内容推送到远程设备,并且应该推送到远程设备,尤其是在这种情况下用于备份时。同样,对于分支,是的,如果要将它们添加到远程,则需要显式推送它们。对于开发来说,这很棒,因为您经常想测试某些东西,但是不必无限期地保留该测试分支。一旦有了所需的东西,就很可能将其合并到dev分支并删除test分支。
LocalPCGuy 2014年

1

我发现这对于我的开发人员来说是一种很好的方法。它将它们从需要备份的内容更改为仅部署端点。

所有配置和软件包安装清单都存储在Puppet中,从而可以轻松地重新部署和更新配置。Puppet目录使用git备份。Kickstart用于进行初始部署。

我还为当时正在开发的任何软件包保留了一个自定义的YUM存储库。这样做还有一个好处,就是我们正在使用的任何软件包都不会在本地系统上作为无人值守的二进制文件保留-如果发生这种情况,文件会变得很糟糕。有人没有遵循正确的程序。



1

这是一种使用的方法,很有意义。

Keepconf为此工作使用rsync和git,它是此工具的包装,使事情变得容易。

您只需要一个配置了ssh-key的中央服务器即可访问备份服务器,并且只需在配置文件中添加几行即可。例如,这是我自己的文件,用于保留所有/ etc /和debian软件包的安装:

[hosts]
192.168.1.10
192.168.1.11
192.168.1.12

[files]
/etc/*
/var/lib/dpkg/status

这样,我就拥有了rsync备份和git commit。


0

我个人认为这基本上是倒退。您将文件推送到备份解决方案中,而不是将其拉出。

更好的办法是首先集中化服务器的配置,然后使用诸如puppet之类的方法将其拉低。

就是说,这可能行得通,我只是认为那没那么好。

尝试研究backuppc-它非常容易设置,坦率地说非常出色。


0

它会有些工作,但有两个警告。

  1. 提交时,不会自动选择添加的文件。在执行提交之前,使用--porcelean om git status查找要添加的新内容。

  2. 为什么要为.ssh进行远程安装,麻烦呢?Bd可能很脆弱,您不会知道它失败了。使用正常的ssh键登录,将裸存储库用于远端。只要存储库是光秃秃的,并且您仅从一个源进行推送,就可以保证在没有合并的情况下也可以工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.