6.11 用Git备份版本控制
人们在备份数据时会采取不同的策略。不过,比起将整个源目录复制到目的端的备份目录中,并使用日期或时间作为版本号,利用差异备份(Differential backup)要更有效。前者只会白白浪费存储空间。而我们只需要复制那些在备份之后发生变化的文件。这被称为增量备份(incremental backup)。我们可以用rsync
这类工具手动创建增量备份。不过恢复这种备份可不是件易事。维护和恢复变更的最好方法是使用版本控制系统。由于代码变更频繁,版本控制系统多用于软件开发与代码维护。Git(GNU it)是有名气也是最高效的版本控制系统。我们可以在非编程环境下用Git备份普通文件。通过你使用的发行版的软件包管理器来安装Git。它可是Linus Trovalds编写的哦。
6.11.1 预备知识
下面是有待处理的问题:
我们有一个目录,里面包含了多个文件和子目录。我们需要跟踪目录内容的变更并对其备份。如果数据受损或丢失,我们必须能够恢复数据之前的备份。我们需要将数据定期备份到远程主机上。同样需要在同一台主机(本地主机)的不同位置进行备份。让我们看看如何用Git搞定它。
6.11.2 实战演练
进入需要备份的目录:
- $ cd /home/data/source
使其成为需要跟踪的源目录。
设置并初始化远端备份目录。在远程主机中创建备份目录:
- $ mkdir -p /home/backups/backup.git
- $ cd /home/backups/backup.git
- $ git init --bare
在源主机中执行下列步骤。
- 在源主机中添加用户详细信息:
- $ git config --global user.name "Sarath Lakshman"
- #将用户名设置为 "Sarath Lakshman"
- $ git config --global user.email slynux@slynux.com
- # 将email设置为slynux@slynux.com
初始化主机中需要进行备份的源目录。在源目录中执行下列命令:
- $ git init
- Initialized empty Git repository in /home/backups/backup.git/
- # 初始化git仓库
- $ git commit --allow-empty -am "Init"
- [master (root-commit) b595488] Init
- 在源目录中执行下列命令添加远程git目录并同步备份:
- $ git remote add origin user@remotehost:/home/backups/backup.git
- $ git push origin master
- Counting objects: 2, done.
- Writing objects: 100% (2/2), 153 bytes, done.
- Total 2 (delta 0), reused 0 (delta 0)
- To user@remotehost:/home/backups/backup.git
- * [new branch] master -> master
- 为Git跟踪(Git tracking)添加或删除文件
下面的命令将当前目录下的所有文件和文件夹添加到备份列表中:
- $ git add *
我们可以有条件地添加某些文件到备份列表中:
- $ git add *.txt
- $ git add *.py
我们可以删除不需要跟踪的文件和文件夹:
- $ git rm file
也可以是文件,甚至是通配符:
- $ git rm *.txt
- 检查点或创建备份点
用下列命令利用一个消息来标记备份的检查点(check point):
- $ git commit -m "Commit Message"
我们需要定期更新远端的备份,因此需要设置一个cron
任务(例如,每5个小时进行一次备份)。
用下面的内容创建一个crontab
项:
- 0 */5 * * * /home/data/backup.sh
创建脚本 /home/data/backup.sh:
#!/bin/ bash
cd /home/data/source
git add .
git commit -am "Commit - @ $(date)"
git push
现在我们就算是完成了备份系统的设置。
- 用Git恢复数据
查看所有的备份版本,可以使用:
- $ git log
忽略最近的任何变更,将当前目录更新到最新的备份版本。
要返回任何之前的状态或版本,要查看一个由32位16进制串组成的提交ID(commit ID)。通过
git checkout
来使用提交ID。如果是提交ID 3131f9661ec1739f72c213ec5769bc0abefa85a9的话,那就是:
- $ git checkout 3131f9661ec1739f72c213ec5769bc0abefa85a9
- $ git commit -am "Restore @ $(date) commit ID:
- 3131f9661ec1739f72c213ec5769bc0abefa85a9"
- $ git push
- 要再次查看版本细节信息,可以使用:
- $ git log
如果工作目录由于某些原因受到了损坏,我们需要用远端的备份来修复目录。
按照下面的方法从远端备份中重建损坏的内容:
- $ git clone user@remotehost:/home/backups/backup.git
这条命令将创建一个包含全部内容的目录。