novel-doomsday-resurgence/gitea_novel_manager.sh
唐天洛 5dc8c00de0 feat(sync): 固化小说内容到Git仓库
📚 小说内容:
- 《末日重生-开局囤货十亿物资》33章
- 完整的状态文件、记忆索引、钩子系统

🛠️ 系统配置:
- 版本控制管理系统
- 自动化脚本系统
- 质量监控系统

🧠 固化记忆:
- 长期记忆文件
- 系统配置文档
- 恢复流程指南

💾 数据安全:
- 本地备份系统
- Git版本控制
- 远程同步机制

同步时间: 2026-03-30 16:25:35
系统状态: inkos正常运行中 (PID: 1433309)
创作进度: 第33章《油粮》创作中
2026-03-30 16:25:35 +08:00

275 lines
7.4 KiB
Bash
Executable File

#!/bin/bash
# Gitea小说项目管理脚本
# 用于管理同步到Gitea的小说项目
PROJECTS_DIR="/root/.openclaw/workspace/projects"
GITEA_BASE="https://gitea.nevadalice.top:226/liyuchen"
# 项目映射
declare -A PROJECT_MAP=(
["末日重生_囤货"]="novel-doomsday-resurgence"
["杀了婆婆的我"]="novel-killed-mother-in-law"
["挑战者"]="novel-challenger"
["小说工具"]="novel-tools"
)
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
show_status() {
echo "📊 Gitea小说项目状态"
echo "======================"
echo ""
for local_dir in "${!PROJECT_MAP[@]}"; do
repo_name="${PROJECT_MAP[$local_dir]}"
project_path="$PROJECTS_DIR/$local_dir"
echo "📖 $(echo $local_dir | sed 's/_/ /g')"
echo " ├─ 本地目录: $project_path"
echo " ├─ Gitea仓库: $repo_name"
echo " ├─ 访问地址: $GITEA_BASE/$repo_name"
if [ -d "$project_path" ]; then
cd "$project_path"
# 本地状态
chapter_count=$(find . -name "*.md" | wc -l)
last_commit=$(git log -1 --format="%ad" --date=short 2>/dev/null || echo "无")
# 远程状态
remote_url=$(git remote get-url origin 2>/dev/null || echo "未配置")
echo " ├─ 本地章节: $chapter_count"
echo " ├─ 最后提交: $last_commit"
echo " └─ 远程仓库: $(echo $remote_url | sed 's|https://gitea.nevadalice.top:226/liyuchen/||')"
else
echo " ├─ 状态: ❌ 本地目录不存在"
fi
echo ""
done
}
sync_project() {
local_dir="$1"
if [ -z "$local_dir" ]; then
echo "请指定要同步的项目目录名:"
echo "可用项目: ${!PROJECT_MAP[@]}"
read local_dir
fi
repo_name="${PROJECT_MAP[$local_dir]}"
if [ -z "$repo_name" ]; then
echo "❌ 未知项目: $local_dir"
echo "可用项目: ${!PROJECT_MAP[@]}"
return 1
fi
project_path="$PROJECTS_DIR/$local_dir"
if [ ! -d "$project_path" ]; then
echo "❌ 本地目录不存在: $project_path"
return 1
fi
echo "🔄 同步项目: $local_dir -> $repo_name"
echo " 本地路径: $project_path"
echo " 远程仓库: $GITEA_BASE/$repo_name"
echo ""
cd "$project_path"
# 检查是否有未提交的更改
if [ -n "$(git status --porcelain)" ]; then
echo "📝 检测到未提交的更改:"
git status --short
echo ""
echo "是否提交这些更改? (y/n)"
read confirm
if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then
echo "请输入提交信息:"
read commit_msg
if [ -z "$commit_msg" ]; then
commit_msg="更新 $(date '+%Y-%m-%d %H:%M:%S')"
fi
git add .
git commit -m "$commit_msg"
echo "✅ 更改已提交"
else
echo "⚠️ 跳过提交,直接推送现有提交"
fi
fi
# 配置远程仓库
if ! git remote get-url origin >/dev/null 2>&1; then
echo "🔧 配置远程仓库..."
git remote add origin "$GITEA_BASE/$repo_name.git"
fi
# 推送到Gitea
echo "🚀 推送到Gitea..."
if git push -u origin master 2>&1 | grep -E "(error|fatal)"; then
echo "⚠️ 推送失败,尝试强制推送..."
if git push -u origin master --force 2>&1 | grep -E "(error|fatal)"; then
echo "❌ 推送失败,请检查网络或权限"
return 1
else
echo "✅ 强制推送成功!"
fi
else
echo "✅ 推送成功!"
fi
echo ""
echo "🌐 仓库地址: $GITEA_BASE/$repo_name"
log "同步项目: $local_dir -> $repo_name"
}
sync_all() {
echo "🔄 同步所有项目到Gitea"
echo "======================"
echo ""
for local_dir in "${!PROJECT_MAP[@]}"; do
echo "📦 同步: $local_dir"
sync_project "$local_dir"
echo ""
done
echo "✅ 所有项目同步完成!"
}
clone_project() {
repo_name="$1"
if [ -z "$repo_name" ]; then
echo "请指定要克隆的仓库名:"
echo "可用仓库: ${PROJECT_MAP[@]}"
read repo_name
fi
# 检查是否是对应的仓库名
local_dir=""
for key in "${!PROJECT_MAP[@]}"; do
if [ "${PROJECT_MAP[$key]}" = "$repo_name" ]; then
local_dir="$key"
break
fi
done
if [ -z "$local_dir" ]; then
echo "❌ 未知仓库: $repo_name"
echo "可用仓库: ${PROJECT_MAP[@]}"
return 1
fi
project_path="$PROJECTS_DIR/$local_dir"
if [ -d "$project_path" ]; then
echo "⚠️ 本地目录已存在: $project_path"
echo "是否重新克隆? (y/n)"
read confirm
if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
echo "取消克隆"
return 0
fi
# 备份现有目录
backup_dir="${project_path}_backup_$(date '+%Y%m%d_%H%M%S')"
mv "$project_path" "$backup_dir"
echo "📦 原目录已备份到: $backup_dir"
fi
echo "⬇️ 克隆仓库: $repo_name"
echo " 到目录: $project_path"
echo ""
git clone "$GITEA_BASE/$repo_name.git" "$project_path"
if [ $? -eq 0 ]; then
echo "✅ 克隆成功!"
echo " 本地路径: $project_path"
log "克隆仓库: $repo_name -> $project_path"
else
echo "❌ 克隆失败"
# 恢复备份
if [ -d "$backup_dir" ]; then
mv "$backup_dir" "$project_path"
echo "已恢复原目录"
fi
fi
}
open_gitea() {
echo "🌐 打开Gitea页面..."
echo ""
echo "首页: $GITEA_BASE"
echo ""
for repo_name in "${PROJECT_MAP[@]}"; do
echo "📖 $repo_name: $GITEA_BASE/$repo_name"
done
echo ""
echo "请使用浏览器访问以上链接"
}
show_help() {
echo "Gitea小说项目管理脚本"
echo "======================"
echo ""
echo "用法: $0 [命令]"
echo ""
echo "命令:"
echo " status 显示所有项目状态"
echo " sync [项目] 同步指定项目到Gitea"
echo " sync-all 同步所有项目到Gitea"
echo " clone [仓库] 从Gitea克隆仓库到本地"
echo " open 打开Gitea页面链接"
echo " help 显示帮助信息"
echo ""
echo "示例:"
echo " $0 status # 查看所有项目状态"
echo " $0 sync 末日重生_囤货 # 同步《末日重生》项目"
echo " $0 sync-all # 同步所有项目"
echo " $0 clone novel-tools # 克隆工具集仓库"
echo ""
echo "可用项目:"
for local_dir in "${!PROJECT_MAP[@]}"; do
echo " - $local_dir (Gitea: ${PROJECT_MAP[$local_dir]})"
done
}
# 主程序
case "$1" in
"status")
show_status
;;
"sync")
sync_project "$2"
;;
"sync-all")
sync_all
;;
"clone")
clone_project "$2"
;;
"open")
open_gitea
;;
"help"|"--help"|"-h"|"")
show_help
;;
*)
echo "❌ 未知命令: $1"
echo ""
show_help
;;
esac