方法 1:纯 Git 命令实现
# 进入需备份的目录
cd /d/项目文件夹
# 初始化Git仓库(若未初始化)
git init
# 首次完全备份
git add . && git commit -m "初始完整备份"
# 后续差异备份:
git add -u # 添加所有已追踪的变更文件
git add [新文件路径] # 单独添加新增文件
git commit -m "差异备份 $(date +"%Y-%m-%d %H:%M")"
方法 2:rsync 硬链接备份(高效节省空间)
# 创建目标备份目录结构
mkdir -p /d/备份仓库/$(date +"%Y%m%d")
# 执行差异备份(使用硬链接复用未修改文件)
rsync -a --link-dest=/d/备份仓库/上一备份目录 \
/d/项目文件夹/ \
/d/备份仓库/$(date +"%Y%m%d")/
参数说明:
-a
:归档模式(保留权限、时间戳等)--link-dest=DIR
:指定上次备份目录,未修改文件创建硬链接--delete
:自动删除目标端多余文件(可选)
方法 3:find + tar 按时间筛选备份
# 创建差异备份压缩包(备份24小时内修改的文件)
find /d/项目文件夹 -type f -mtime -1 -print0 | \
tar -czvf /d/备份/$(date +"%Y%m%d").tar.gz --null -T -
参数说明:
-mtime -1
:最近24小时修改的文件-print0
和-T -
:处理含空格的文件路径
方法 4:Git + rsync 自动化脚本
创建 backup.sh
脚本:
#!/bin/bash
SOURCE="/d/项目文件夹"
LAST_BACKUP="/d/备份/最新备份"
# 查找最近备份目录
find /d/备份 -maxdepth 1 -type d -name "backup_*" -printf "%T@ %p\n" | \
sort -n | tail -1 | cut -d' ' -f2 > /tmp/last_backup.txt
LAST_BACKUP=$(cat /tmp/last_backup.txt)
# 执行差异备份
NEW_BACKUP="/d/备份/backup_$(date +%s)"
rsync -a --link-dest="$LAST_BACKUP" "$SOURCE/" "$NEW_BACKUP"
# 创建软链接指向最新备份
rm -f "$LAST_BACKUP"
ln -s "$NEW_BACKUP" "$LAST_BACKUP"
运行脚本:
chmod +x backup.sh
./backup.sh
关键命令速查表
命令 | 作用 | 示例 |
---|---|---|
rsync -a | 归档模式同步文件 | rsync -a source/ dest/ |
--link-dest | 创建硬链接节省空间 | --link-dest=/backup/last/ |
find -mtime | 按修改时间过滤文件 | find . -mtime -1 |
git add -u | 只添加已追踪文件的修改 | git add -u && git commit |
tar --newer | 打包指定时间后的文件 | tar -czf backup.tgz --newer "2023-08-15" |
备份验证技巧
-
检查备份完整性:
diff -rq /d/项目文件夹 /d/备份/最新备份
-
查看文件变更历史:
git log --name-status # 在Git管理的备份目录中
-
统计备份大小:
du -sh /d/备份/* # 查看各备份目录大小
最佳实践
-
设置定时任务:
# 每天凌晨1点执行备份 crontab -e 0 1 * * * /d/scripts/backup.sh
-
排除不需要的文件:
创建.gitignore
或exclude.list
文件:*.tmp /cache/ ~$*.docx
在 rsync 中使用排除:
rsync -a --exclude-from='exclude.list' source/ dest/
-
保留多版本备份:
timeline 2023-08-01 : 初始完整备份 2023-08-02 : 差异备份 : 12个文件 2023-08-03 : 差异备份 : 仅3个文件 2023-08-04 : 周完整备份
通过这些方法,你可以在 Git Bash 中高效实现文件夹级差异备份,兼顾灵活性与存储效率。