Files

137 lines
2.9 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# OpenClaw 自动备份脚本
# 使用方法: ./backup.sh [commit message]
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BACKUP_DIR="$(cd "$SCRIPT_DIR/../../.." && pwd)"
GIT_REMOTE="origin"
NO_PUSH=0
DRY_RUN=0
PULL_BEFORE=0
COMMIT_MSG=""
usage() {
cat <<'USAGE'
Usage:
backup.sh [message]
Options:
--pull 备份前先 git pull --rebase要求工作区干净
--no-push 只提交,不推送
--dry-run 仅显示变更,不提交
-m, --message 提交信息
-h, --help 显示帮助
USAGE
}
parse_args() {
while [ $# -gt 0 ]; do
case "$1" in
--pull) PULL_BEFORE=1 ;;
--no-push) NO_PUSH=1 ;;
--dry-run) DRY_RUN=1 ;;
-m|--message)
shift
COMMIT_MSG="$1"
;;
-h|--help)
usage
exit 0
;;
*)
if [ -z "$COMMIT_MSG" ]; then
COMMIT_MSG="$1"
else
COMMIT_MSG="$COMMIT_MSG $1"
fi
;;
esac
shift
done
}
parse_args "$@"
cd "$BACKUP_DIR"
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
echo "✗ 当前目录不是 Git 仓库: $BACKUP_DIR"
exit 1
fi
if ! git remote get-url "$GIT_REMOTE" >/dev/null 2>&1; then
GIT_REMOTE="$(git remote | head -n1)"
fi
if [ -z "$GIT_REMOTE" ]; then
echo "⚠️ 未找到 Git 远端"
fi
REPO_URL=""
if [ -n "$GIT_REMOTE" ]; then
REPO_URL="$(git remote get-url "$GIT_REMOTE" 2>/dev/null || true)"
fi
CURRENT_BRANCH="$(git rev-parse --abbrev-ref HEAD 2>/dev/null || true)"
echo "🔄 开始备份 OpenClaw 配置..."
if [ "$PULL_BEFORE" -eq 1 ]; then
if git diff --quiet && git diff --staged --quiet; then
echo "⬇️ 拉取最新代码..."
git pull --rebase || echo "⚠️ git pull 失败,请手动处理"
else
echo "⚠️ 工作区有未提交变更,跳过 git pull"
fi
fi
# 检查是否有更改
if [ -z "$(git status --porcelain)" ]; then
echo "✅ 没有需要备份的更改"
exit 0
fi
if [ "$DRY_RUN" -eq 1 ]; then
echo "📄 变更预览:"
git status --short
exit 0
fi
# 默认提交信息
if [ -z "$COMMIT_MSG" ]; then
COMMIT_MSG="Backup: $(date '+%Y-%m-%d %H:%M:%S')"
fi
echo " 添加更改到暂存区..."
git add -A
echo "💾 提交更改..."
git commit -m "$COMMIT_MSG"
if [ "$NO_PUSH" -eq 0 ]; then
echo "☁️ 推送到 GitHub..."
if [ -n "$GIT_REMOTE" ] && [ -n "$CURRENT_BRANCH" ]; then
if ! git push "$GIT_REMOTE" "$CURRENT_BRANCH"; then
echo "✗ 推送失败:可能需要先 git pull --rebase"
exit 1
fi
else
if ! git push; then
echo "✗ 推送失败:请检查 Git 远端或设置上游分支"
exit 1
fi
fi
else
echo "⚠️ 跳过推送(--no-push"
fi
echo "✅ 备份完成!"
echo "📦 仓库地址: ${REPO_URL:-N/A}"
if [ -n "$CURRENT_BRANCH" ]; then
echo "🌿 分支: ${GIT_REMOTE:-?}/${CURRENT_BRANCH}"
fi
echo "📝 提交信息: $COMMIT_MSG"