Git Bash 中找不到 `rsync` 命令,这很正常,因为 Windows 版的 Git Bash 默认不包含 rsync

替代方案 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)"
使用方法:
  1. 将脚本保存为 git-diff-backup.sh
  2. 修改顶部的 SOURCE_DIRBACKUP_DIR 路径
  3. 运行:
    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 工具,功能强大且兼容性好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值