替代方案 1:安装 rsync
通过 MSYS2 安装:
# 下载并安装 MSYS2
curl -OL https://repo.msys2.org/distrib/x86_64/msys2-x86_64-20231026.exe
./msys2-x86_64-20231026.exe
# 安装后,在 MSYS2 终端中执行
pacman -Syu
pacman -S rsync
通过 Chocolatey(Windows 包管理器)安装:
# 先安装 Chocolatey(管理员权限 PowerShell)
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
# 安装 rsync
choco install rsync
替代方案 2:使用纯 Git 实现差异备份
创建备份脚本 git-diff-backup.sh
:
#!/bin/bash
SOURCE_DIR="/d/你的项目目录"
BACKUP_DIR="/d/备份目录"
LATEST_BACKUP="$BACKUP_DIR/latest"
# 首次初始化备份
if [ ! -d "$LATEST_BACKUP" ]; then
echo "正在创建初始备份..."
mkdir -p "$LATEST_BACKUP"
cp -a "$SOURCE_DIR"/. "$LATEST_BACKUP/"
echo "✅ 初始备份完成"
exit 0
fi
# 创建新备份目录
NEW_BACKUP="$BACKUP_DIR/backup-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$NEW_BACKUP"
# 差异备份核心函数
diff_copy() {
find "$SOURCE_DIR" -type f | while read -r file; do
rel_path="${file#$SOURCE_DIR/}"
target_file="$NEW_BACKUP/$rel_path"
existing_file="$LATEST_BACKUP/$rel_path"
mkdir -p "$(dirname "$target_file")"
# 文件存在且不同时才复制
if [ -f "$existing_file" ]; then
if cmp -s "$file" "$existing_file"; then
# 文件相同,不操作
:
else
cp "$file" "$target_file"
echo "🔄 更新文件: $rel_path"
fi
else
cp "$file" "$target_file"
echo "➕ 新文件: $rel_path"
fi
done
}
echo "开始差异备份..."
diff_copy
# 更新最新备份链接
rm -f "$BACKUP_DIR/previous"
mv "$LATEST_BACKUP" "$BACKUP_DIR/previous"
ln -sfn "$NEW_BACKUP" "$LATEST_BACKUP"
echo "✅ 备份完成:$NEW_BACKUP"
echo "修改文件数: $(find "$NEW_BACKUP" -type f | wc -l)"
使用方法:
- 将脚本保存为
git-diff-backup.sh
- 修改顶部的
SOURCE_DIR
和BACKUP_DIR
路径 - 运行:
chmod +x git-diff-backup.sh ./git-diff-backup.sh
替代方案 3:使用 Git 内置功能
创建 Git 自动化备份:
# 在项目目录初始化
cd /d/你的项目目录
git init
# 首次提交
git add .
git commit -m "初始备份"
# 创建备份脚本
cat > git-backup.sh <<\EOF
#!/bin/bash
git add -u
if git diff-index --quiet HEAD --; then
echo "无变更,跳过备份"
else
git commit -m "差异备份 $(date +'%Y-%m-%d %H:%M')"
echo "✅ 已创建新备份点"
fi
EOF
# 设置定时任务(每天备份)
echo "0 20 * * * /d/你的项目目录/git-backup.sh" | crontab
替代方案 4:使用 Windows 工具(无需额外安装)
创建 PowerShell 差异备份脚本 diff-backup.ps1
:
$Source = "C:\你的文件夹"
$BackupRoot = "D:\差异备份"
$LatestBackup = "$BackupRoot\Latest"
# 创建首次完整备份
if (-not (Test-Path $LatestBackup)) {
New-Item -ItemType Directory -Path $LatestBackup | Out-Null
Robocopy $Source $LatestBackup /E /COPYALL /DCOPY:T /R:1 /W:1
Write-Host "✅ 初始完整备份完成"
exit
}
# 创建差异备份
$NewBackup = "$BackupRoot\Backup-{0:yyyyMMdd-HHmmss}" -f (Get-Date)
New-Item -ItemType Directory -Path $NewBackup | Out-Null
$Stats = Robocopy $Source $NewBackup /E /COPYALL /DCOPY:T /XA:H /XO /XN /XC /XX /L /NP /NS /NC /NDL /NJH /NJS
# 删除空目录
Get-ChildItem $NewBackup -Recurse -Directory |
Where-Object { $_.GetFiles().Count -eq 0 -and $_.GetDirectories().Count -eq 0 } |
Remove-Item
if ($Stats -match "已复制文件数\s+:\s+(\d+)") {
# 更新符号链接
$Previous = "$BackupRoot\Previous"
if (Test-Path $Previous) { Remove-Item $Previous -Force }
Rename-Item $LatestBackup -NewName ([System.IO.Path]::GetFileName($Previous)) -Force
New-Item -ItemType Junction -Path $LatestBackup -Target $NewBackup | Out-Null
Write-Host "✅ 差异备份完成:$NewBackup"
Write-Host "复制文件数: $($Matches[1])"
} else {
Remove-Item $NewBackup -Recurse -Force
Write-Host "⚠ 无文件变更,跳过备份"
}
注意:此脚本使用了
Robocopy
,这是 Windows 自带的强大复制工具,支持各种备份参数。
备份验证方法
# 比较源文件和最新备份
diff -rq "$SOURCE_DIR" "$LATEST_BACKUP" --ignore-file-name-case
# 查看备份目录占用空间
du -sh "$BACKUP_DIR"/*
这些方案完全在 Windows 原生环境下工作,无需额外安装 Linux 工具即可实现高效的差异备份功能。推荐使用 PowerShell 脚本方案,它利用了 Windows 自带的 Robocopy 工具,功能强大且兼容性好。