脚本能自动备份Git仓库吗?

wen 实用脚本 1

本文目录导读:

脚本能自动备份Git仓库吗?

  1. 方案一:Shell 脚本备份到本地目录 + 远程镜像(Linux/macOS)
  2. 方案二:PowerShell 脚本(Windows)
  3. 方案三:使用 Git 原生安全备份(推送到指定远程)
  4. 关键注意事项
  5. 简化工具推荐

是的,可以通过脚本自动备份Git仓库,常见的备份方式包括:克隆/拉取到本地、推送到多个远程仓库、打包压缩存档,以及定时执行(通过cron、Task Scheduler等)。

以下提供几种常用的脚本方案,适用于 Linux/macOS 和 Windows。


Shell 脚本备份到本地目录 + 远程镜像(Linux/macOS)

这个脚本会遍历一个仓库列表,将每个仓库备份(镜像)到本地,并可选推送到备份服务器。

创建脚本 git_backup.sh

#!/bin/bash
# ===== 配置区域 =====
BACKUP_DIR="/path/to/your/backup/folder"  # 备份存储路径
REPO_LIST=(
    "git@github.com:user/repo1.git"
    "https://github.com/user/repo2.git"
    "git@gitlab.com:user/private-repo.git"
)
# 备用远程(可选,例如推送到另一个 Git 服务器)
BACKUP_REMOTE="git@backup-server.com:backups/"
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE="${BACKUP_DIR}/backup_log_${DATE}.txt"
# ===================
mkdir -p "$BACKUP_DIR"
echo "备份开始: $(date)" > "$LOG_FILE"
for REPO_URL in "${REPO_LIST[@]}"; do
    # 提取仓库名 (user/repo1.git -> repo1)
    REPO_NAME=$(basename "$REPO_URL" .git)
    TARGET_DIR="${BACKUP_DIR}/${REPO_NAME}"
    echo "正在处理: $REPO_NAME" | tee -a "$LOG_FILE"
    if [ -d "$TARGET_DIR/.git" ]; then
        # 如果已存在,则拉取最新(对于镜像仓库使用 fetch,更高效)
        cd "$TARGET_DIR"
        # 使用 --mirror 模式:完全镜像所有分支和标签
        git fetch --all --prune 2>&1 | tee -a "$LOG_FILE"
        # 可选:更新所有分支
        # git pull --all --rebase  # 注意:非 bare 仓库可能冲突
    else
        # 首次克隆(带 --mirror 选项,只包含 .git 数据,不产生工作目录,空间更小且完整)
        git clone --mirror "$REPO_URL" "$TARGET_DIR" 2>&1 | tee -a "$LOG_FILE"
    fi
    # 可选:推送到备份远程
    # cd "$TARGET_DIR"
    # git remote add backup "${BACKUP_REMOTE}${REPO_NAME}.git" 2>/dev/null
    # git push --mirror backup 2>&1 | tee -a "$LOG_FILE"
    echo "完成: $REPO_NAME" | tee -a "$LOG_FILE"
    echo "------------------------" >> "$LOG_FILE"
done
# 可选:将备份目录压缩存档(节约空间)
# tar -czf "${BACKUP_DIR}/full_backup_${DATE}.tar.gz" -C "$BACKUP_DIR" --exclude="*.tar.gz" .
echo "备份结束: $(date)" >> "$LOG_FILE"

赋予执行权限并运行

chmod +x git_backup.sh
./git_backup.sh

设置定时任务(cron)

crontab -e
# 每天凌晨3点执行
0 3 * * * /path/to/git_backup.sh

PowerShell 脚本(Windows)

适用于 Windows 环境,使用 git clone --mirrorgit fetch

创建 git_backup.ps1

param(
    [string]$BackupDir = "D:\GitBackups",
    [string[]]$RepoUrls = @(
        "https://github.com/user/repo1.git",
        "git@gitlab.com:user/repo2.git"
    )
)
$date = Get-Date -Format "yyyyMMdd_HHmmss"
$logFile = Join-Path $BackupDir "backup_log_$date.txt"
New-Item -ItemType Directory -Path $BackupDir -Force | Out-Null
"备份开始: $(Get-Date)" | Out-File $logFile
foreach ($repoUrl in $RepoUrls) {
    # 提取仓库名
    $repoName = [System.IO.Path]::GetFileNameWithoutExtension($repoUrl)
    $targetDir = Join-Path $BackupDir $repoName
    Write-Host "正在处理: $repoName"
    "处理: $repoName" | Out-File $logFile -Append
    if (Test-Path "$targetDir\.git") {
        # 更新
        Set-Location $targetDir
        git fetch --all --prune 2>&1 | Out-File $logFile -Append
        git pull --all --rebase 2>&1 | Out-File $logFile -Append
    } else {
        # 克隆
        git clone --mirror $repoUrl $targetDir 2>&1 | Out-File $logFile -Append
    }
    "完成: $repoName" | Out-File $logFile -Append
}
"备份结束: $(Get-Date)" | Out-File $logFile -Append

设置计划任务(Windows)

  • 打开“任务计划程序”
  • 创建基本任务,触发器设为每天/每周
  • 操作:启动程序 → powershell.exe
  • 参数:-File "C:\Scripts\git_backup.ps1" -BackupDir "D:\Backups"

使用 Git 原生安全备份(推送到指定远程)

将备份视为另一个远程仓库,本地只需执行 git push --mirror

#!/bin/bash
# 对已有仓库执行推送镜像备份
LOCAL_REPOS_DIR="/path/to/your/local/repos"
BACKUP_REMOTE="git@backup-server.com:backups/"
cd "$LOCAL_REPOS_DIR"
for repo in */; do
    cd "$LOCAL_REPOS_DIR/$repo"
    if [ -d ".git" ]; then
        echo "备份 $repo"
        git remote add backup "${BACKUP_REMOTE}${repo%/}.git"
        git push --mirror backup
    fi
done

关键注意事项

  1. 认证

    • SSH 方式:确保脚本运行账户有 SSH 密钥,且密钥已添加到 Git 平台(GitHub/GitLab)。
    • HTTPS 方式:考虑使用 GIT_ASKPASS 或凭据管理器,或使用 personal access token(PAT)嵌入 URL:https://<user>:<token>@github.com/...
  2. 镜像 vs 普通克隆

    • --mirror:只包含 .git 数据,不含工作目录,适合 100% 备份,恢复时需 git clone
    • --bare:类似但不包括 refs/remotes/origin/ 的额外映射,日常建议用 --mirror
  3. 增量备份

    • 首次完整克隆,之后仅 git fetch --all --prune,极大减少带宽和时间。
  4. 存储空间

    • 备份目录会越来越大,定期清理旧备份或使用 git gc 压缩。
  5. 权限与安全

    • 备份应存储在加密磁盘或信任的网络中,包含敏感代码时使用 gpg 加密。
  6. 测试恢复

    定期从备份中克隆一个仓库到临时目录,验证数据完整性。


简化工具推荐

如果不想自己写脚本,也可以考虑:

  • git-backup (Ruby gem)
  • myrepos (mr) + cron
  • BorgBackup + git hooks(支持增量、加密)

  • 可以自动备份,而且方式灵活。
  • 脚本核心逻辑:git clone --mirror(初始)+ git fetch --all(增量)。
  • 配合 cron/Task Scheduler 可实现定时自动备份。
  • 注意处理认证、存储和备份验证。

如果你需要更具体的脚本(例如备份 GitHub 组织所有仓库、或带加密的版本),可以进一步说明需求。

抱歉,评论功能暂时关闭!