本文目录导读:

- 方案一: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 组织所有仓库、或带加密的版本),可以进一步说明需求。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播