在服务器上,安装git

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


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

对于不重要的非重要开发服务器想要在适当的备份系统上进行设置的麻烦/成本,并且备份只是为了方便(IE,我们不需要备份此服务器,但是如果出了问题,它将节省一些时间),这可能是有效的备份解决方案,还是会掉进一大堆船尾?

评论

不会使用类似的想法来分享吗?

@ B14D3我认为sparkleshare更像是一个保管箱类型,但我会对其进行研究

您是对的,但是它使用git来制作某种buckup东西(复制到多台PC并控制文件的版本);)

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

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

#1 楼

你不是一个愚蠢的人。使用git作为备份机制可能会很有吸引力,尽管其他人都说过,git可以很好地处理二进制文件。请从Git书中阅读此页面,以获取有关此主题的更多信息。基本上,由于git并未使用增量存储机制,因此它并不真正在乎文件的外观(但对于具有标准配置的二进制文件,git diff的实用程序非常低)。

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


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

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

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

etckeeper被开发用于备份/etc并解决了许多此类问题。 br />

评论


+1表示ACL /权限

–拉里·西尔弗曼(Larry Silverman)
2011-12-20 17:59

Git也不会存储空目录。

– Flimm
2012年11月22日上午11:05

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

– Cregox
2013年5月10日23:19

由于git不能很好地处理二进制文件,因此您可能还需要研究git附件,这样做可以做得更好。但是,它确实改变了git是什么的想法。

– Wouter Verhelst
15年6月19日在8:33

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

– EKanadily
17年2月16日在11:43

#2 楼

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

评论


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

–涂抹
2011-12-15 13:59

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

–AndréParamés
2011-12-16 14:30

@AndréParamés,所以您的意思是在安装bup之后硬盘崩溃了……mmmmhh ... :)只是在开玩笑

–hofnarwillie
16年6月11日在23:24



BUP项目的上述分支已经站起来。这是官方回购,似乎仍在积极开发中。

– Gillytech
20 Apr 17'0:08



#3 楼

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

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

2,如果您没有构建新机器的过程(文档或自动化的过程),我担心您的开发过程。

灾难恢复固然重要,但是自动化(脚本)安装新开发箱的过程比仅仅进行灾难恢复更为重要。

灾难恢复固然重要备份一切。确保将git用于脚本/文档,但不要用于计算机上的每个文件。

评论


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

–涂抹
2011-12-15 13:56

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

–菲尔·汉嫩(Phil Hannent)
2011-12-15 14:01

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

–user377178
2012年12月22日在22:11

#4 楼

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

#5 楼

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


商业解决方案通常使用自己专有的格式,而您的备份采用的是开源格式,受到了广泛的支持并且非常好记录下来。这使您可以完全控制数据。很容易看到哪些文件以及何时更改。如果要截断历史记录,也可以这样做。是否想抹掉您的历史记录?没问题。取回文件的版本与任何git命令一样简单。
任意数量的镜像,都可以自定义备份时间。您将获得本地镜像,该镜像不受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
2015年8月16日13:35



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

–user64141
15年8月16日在16:33

#6 楼

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


如果硬盘发生故障,如果不按承诺进行操作,则将丢失所有内容另一个服务器/驱动器。 (如果您有计划的话,我宁愿提一下。)

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


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

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

评论


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

–涂抹
2011-12-15 13:58

+1以适应不断增长的空间需求

– hafichuk
2011年12月15日下午16:00

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

–rds
2011-12-16 10:44

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

–亨拉·爱侣湾(Hendy Irawan)
2012-2-13 14:27

#7 楼

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

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

评论


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

–亨拉·爱侣湾(Hendy Irawan)
2012年2月13日下午14:32

请参阅在Git中备份MySQL数据库是一个好主意吗?

–迈克尔·汉普顿
15年4月26日在15:02

#8 楼

我曾经开发过一种基于Subversion的备份解决方案。虽然效果很好(并且git应该更好),但我认为这里有更好的解决方案。我认为rsnapshot是更好的之一-如果不是更好的话。充分利用了硬链接,我有了一个300 GB的文件服务器(带有半百万个文件),每天,每周和每月一次备份可以追溯到一年以前。总使用的磁盘空间仅是一个完整副本+每个备份的增量部分,但是由于有了硬链接,我在每个备份中都有完整的“活动”目录结构。换句话说,文件不仅可以直接在daily.0(最新备份)下访问,甚至可以在daily.1(yestarday)或weekly.2(两个星期前)下直接访问,依此类推。
使用Samba备份文件夹,我的用户只需将PC指向备份服务器就可以从备份中提取文件。
另一个非常好的选择是rdiff-backup,但是我希望始终可以通过标题访问文件\\服务器名的资源管理器,rsnapshot对我来说是一个更好的解决方案。

评论


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

–减少活动
18年4月16日在21:49

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

–shodanshok
18年4月17日在6:18



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

–减少活动
18年4月17日在6:42

#9 楼

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

#10 楼

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


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


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

评论


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

– LocalPCGuy
2014年7月13日在17:04



#11 楼

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

所有配置和程序包安装清单都存储在Puppet中,以方便重新部署和配置更新。用git备份Puppet目录。 Kickstart用于进行初始部署。

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

#12 楼

您可能想查看github上的bup,其目的是使用git进行备份。

评论


先前的答案已经指向相同的工具(bup)。 serverfault.com/a/341213/303467。有什么亮点吗?

–哈维尔
15年8月30日在15:33

#13 楼

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

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。

#14 楼

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

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

那也许行得通,我只是觉得那没什么。

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

#15 楼

它可以工作,但是有两个警告。


提交时,不会自动选择添加的文件。在进行提交之前,请使用--porcelean om git status查找要添加的新内容。
为什么要为.ssh进行远程装载,麻烦呢? Bd可能很脆弱,您不会知道它失败了。使用正常的ssh键登录,将裸存储库用于远端。只要存储库是光秃秃的,并且您仅从一个源进行推送,就可以保证不会进行合并。


#16 楼

写了一个简单的方法来做到这一点:backup-org-files-in-github
这适用于没有协作的文件,以我为例-emacs org文件。我使用cron定期执行git commit,即git push。