6.11 用Git备份版本控制

人们在备份数据时会采取不同的策略。不过,比起将整个源目录复制到目的端的备份目录中,并使用日期或时间作为版本号,利用差异备份(Differential backup)要更有效。前者只会白白浪费存储空间。而我们只需要复制那些在备份之后发生变化的文件。这被称为增量备份(incremental backup)。我们可以用rsync这类工具手动创建增量备份。不过恢复这种备份可不是件易事。维护和恢复变更的最好方法是使用版本控制系统。由于代码变更频繁,版本控制系统多用于软件开发与代码维护。Git(GNU it)是有名气也是最高效的版本控制系统。我们可以在非编程环境下用Git备份普通文件。通过你使用的发行版的软件包管理器来安装Git。它可是Linus Trovalds编写的哦。

6.11.1 预备知识

下面是有待处理的问题:

我们有一个目录,里面包含了多个文件和子目录。我们需要跟踪目录内容的变更并对其备份。如果数据受损或丢失,我们必须能够恢复数据之前的备份。我们需要将数据定期备份到远程主机上。同样需要在同一台主机(本地主机)的不同位置进行备份。让我们看看如何用Git搞定它。

6.11.2 实战演练

进入需要备份的目录:

  1. $ cd /home/data/source

使其成为需要跟踪的源目录。

设置并初始化远端备份目录。在远程主机中创建备份目录:

  1. $ mkdir -p /home/backups/backup.git
  2.  
  3. $ cd /home/backups/backup.git
  4.  
  5. $ git init --bare

在源主机中执行下列步骤。

  • 在源主机中添加用户详细信息:
  1. $ git config --global user.name "Sarath Lakshman"
  2. #将用户名设置为 "Sarath Lakshman"
  3.  
  4. $ git config --global user.email slynux@slynux.com
  5. # 将email设置为slynux@slynux.com

初始化主机中需要进行备份的源目录。在源目录中执行下列命令:

  1. $ git init
  2. Initialized empty Git repository in /home/backups/backup.git/
  3. # 初始化git仓库
  4.  
  5. $ git commit --allow-empty -am "Init"
  6. [master (root-commit) b595488] Init
  • 在源目录中执行下列命令添加远程git目录并同步备份:
  1. $ git remote add origin user@remotehost:/home/backups/backup.git
  2.  
  3. $ git push origin master
  4. Counting objects: 2, done.
  5. Writing objects: 100% (2/2), 153 bytes, done.
  6. Total 2 (delta 0), reused 0 (delta 0)
  7. To user@remotehost:/home/backups/backup.git
  8. * [new branch] master -> master
  • 为Git跟踪(Git tracking)添加或删除文件

下面的命令将当前目录下的所有文件和文件夹添加到备份列表中:

  1. $ git add *

我们可以有条件地添加某些文件到备份列表中:

  1. $ git add *.txt
  2. $ git add *.py

我们可以删除不需要跟踪的文件和文件夹:

  1. $ git rm file

也可以是文件,甚至是通配符:

  1. $ git rm *.txt
  • 检查点或创建备份点

用下列命令利用一个消息来标记备份的检查点(check point):

  1. $ git commit -m "Commit Message"

我们需要定期更新远端的备份,因此需要设置一个cron任务(例如,每5个小时进行一次备份)。

用下面的内容创建一个crontab项:

  1. 0 */5 * * * /home/data/backup.sh

创建脚本 /home/data/backup.sh:

  1. #!/bin/ bash
  2. cd /home/data/source
  3. git add .
  4. git commit -am "Commit - @ $(date)"
  5. git push

现在我们就算是完成了备份系统的设置。

  • 用Git恢复数据

查看所有的备份版本,可以使用:

  1. $ git log

忽略最近的任何变更,将当前目录更新到最新的备份版本。

  • 要返回任何之前的状态或版本,要查看一个由32位16进制串组成的提交ID(commit ID)。通过git checkout来使用提交ID。

  • 如果是提交ID 3131f9661ec1739f72c213ec5769bc0abefa85a9的话,那就是:

  1. $ git checkout 3131f9661ec1739f72c213ec5769bc0abefa85a9
  2.  
  3. $ git commit -am "Restore @ $(date) commit ID:
  4. 3131f9661ec1739f72c213ec5769bc0abefa85a9"
  5. $ git push
  • 要再次查看版本细节信息,可以使用:
  1. $ git log

如果工作目录由于某些原因受到了损坏,我们需要用远端的备份来修复目录。

按照下面的方法从远端备份中重建损坏的内容:

  1. $ git clone user@remotehost:/home/backups/backup.git

这条命令将创建一个包含全部内容的目录。