本文目录导读:

- 方案一:Shell 脚本备份到本地目录 + 远程镜像(Linux/macOS)
- 方案二:PowerShell 脚本(Windows)
- 方案三:使用 Git 原生安全备份(推送到指定远程)
- 关键注意事项
- 简化工具推荐
是的,可以通过脚本自动备份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 --mirror 或 git 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
关键注意事项
-
认证
- SSH 方式:确保脚本运行账户有 SSH 密钥,且密钥已添加到 Git 平台(GitHub/GitLab)。
- HTTPS 方式:考虑使用
GIT_ASKPASS或凭据管理器,或使用personal access token(PAT)嵌入 URL:https://<user>:<token>@github.com/...
-
镜像 vs 普通克隆
--mirror:只包含.git数据,不含工作目录,适合 100% 备份,恢复时需git clone。--bare:类似但不包括refs/remotes/origin/的额外映射,日常建议用--mirror。
-
增量备份
- 首次完整克隆,之后仅
git fetch --all --prune,极大减少带宽和时间。
- 首次完整克隆,之后仅
-
存储空间
- 备份目录会越来越大,定期清理旧备份或使用
git gc压缩。
- 备份目录会越来越大,定期清理旧备份或使用
-
权限与安全
- 备份应存储在加密磁盘或信任的网络中,包含敏感代码时使用
gpg加密。
- 备份应存储在加密磁盘或信任的网络中,包含敏感代码时使用
-
测试恢复
定期从备份中克隆一个仓库到临时目录,验证数据完整性。
简化工具推荐
如果不想自己写脚本,也可以考虑:
- git-backup (Ruby gem)
- myrepos (mr) + cron
- BorgBackup + git hooks(支持增量、加密)
- 可以自动备份,而且方式灵活。
- 脚本核心逻辑:
git clone --mirror(初始)+git fetch --all(增量)。 - 配合 cron/Task Scheduler 可实现定时自动备份。
- 注意处理认证、存储和备份验证。
如果你需要更具体的脚本(例如备份 GitHub 组织所有仓库、或带加密的版本),可以进一步说明需求。