Files
karuo-ai/01_卡资(金)/金仓_存储备份/Gitea管理/脚本/自动同步.sh
karuo 5caf3b1f50
Some checks failed
Sync GitHub to CKB NAS Gitea / sync (push) Has been cancelled
🔄 卡若AI 同步 2026-02-17 15:40 | 变更 17 个文件 | 排除 >20MB: 4 个
2026-02-17 15:40:00 +08:00

143 lines
5.5 KiB
Bash
Executable File
Raw 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
# ============================================
# 卡若AI → Gitea 实时同步open.quwanzhi.com:3000/fnvtk/karuo-ai
# 规则:超过 20MB 的文件不上传(与 Skill 目录规则一致)
# 推送成功后1) 同步百科 2) 写入 gitea_push_log.md 3) 写入 代码管理.md
# ============================================
REPO_DIR="/Users/karuo/Documents/个人/卡若AI"
REMOTE="gitea"
BRANCH="main"
MAX_SIZE_MB=20
LOG_FILE="$REPO_DIR/01_卡资/金仓_存储备份/Gitea管理/sync.log"
PUSH_LOG="$REPO_DIR/运营中枢/工作台/gitea_push_log.md"
CODE_MGMT="$REPO_DIR/运营中枢/工作台/代码管理.md"
GITEA_URL="http://open.quwanzhi.com:3000/fnvtk/karuo-ai"
GITIGNORE="$REPO_DIR/.gitignore"
WIKI_SCRIPT="$REPO_DIR/01_卡资/金仓_存储备份/Gitea管理/脚本/sync_wiki_to_gitea.sh"
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"; }
# 限制 sync.log 大小
if [ -f "$LOG_FILE" ] && [ $(stat -f%z "$LOG_FILE" 2>/dev/null || echo 0) -gt 512000 ]; then
tail -100 "$LOG_FILE" > "$LOG_FILE.tmp" && mv "$LOG_FILE.tmp" "$LOG_FILE"
fi
cd "$REPO_DIR" || { log "错误:无法进入目录 $REPO_DIR"; exit 1; }
# ============================================
# Step 1: 排除 >20MB 文件(动态写入 .gitignore 区段)
# ============================================
MARKER_START="# === 自动排除:超过${MAX_SIZE_MB}MB的文件脚本自动管理勿手动修改==="
MARKER_END="# === 自动排除结束 ==="
LARGE_FILES=$(find . -type f -size +${MAX_SIZE_MB}M -not -path "./.git/*" 2>/dev/null | sort)
NEW_SECTION="$MARKER_START"
if [ -n "$LARGE_FILES" ]; then
while IFS= read -r file; do
clean_path="${file#./}"
NEW_SECTION="$NEW_SECTION
$clean_path"
done <<< "$LARGE_FILES"
fi
NEW_SECTION="$NEW_SECTION
$MARKER_END"
if grep -q "$MARKER_START" "$GITIGNORE" 2>/dev/null; then
python3 -c "
import re
with open('$GITIGNORE', 'r') as f:
content = f.read()
pattern = re.escape('$MARKER_START') + r'.*?' + re.escape('$MARKER_END')
new_content = re.sub(pattern, '''$NEW_SECTION''', content, flags=re.DOTALL)
with open('$GITIGNORE', 'w') as f:
f.write(new_content)
" 2>/dev/null
else
echo "" >> "$GITIGNORE"
echo "$NEW_SECTION" >> "$GITIGNORE"
fi
LARGE_COUNT=$(echo "$LARGE_FILES" | grep -c '.' 2>/dev/null || echo 0)
log "大文件扫描:$LARGE_COUNT 个 >${MAX_SIZE_MB}MB 已排除"
# ============================================
# Step 2: 检查是否有变更
# ============================================
git add -A 2>/dev/null
if git diff --cached --quiet 2>/dev/null; then
log "无变更,跳过同步"
exit 0
fi
# ============================================
# Step 3: 提交
# ============================================
CHANGED_COUNT=$(git diff --cached --numstat | wc -l | tr -d ' ')
TIMESTAMP=$(date '+%Y-%m-%d %H:%M')
COMMIT_MSG="🔄 卡若AI 同步 $TIMESTAMP | 变更 ${CHANGED_COUNT} 个文件 | 排除 >${MAX_SIZE_MB}MB: ${LARGE_COUNT}"
git commit -m "$COMMIT_MSG" --quiet 2>/dev/null
if [ $? -ne 0 ]; then
log "错误:提交失败"
exit 1
fi
log "提交成功:${CHANGED_COUNT} 个文件"
# ============================================
# Step 4: 推送到 Gitea智能局域网用 IP外网用域名+代理)
# ============================================
PUSH_SCRIPT="$REPO_DIR/01_卡资/金仓_存储备份/Gitea管理/脚本/gitea_push_smart.sh"
if [ -x "$PUSH_SCRIPT" ]; then
bash "$PUSH_SCRIPT" "$REPO_DIR" "$REMOTE" "$BRANCH" 2>&1 | tee -a "$LOG_FILE"
PUSH_RESULT=${PIPESTATUS[0]}
else
git push "$REMOTE" "$BRANCH" --quiet 2>&1
PUSH_RESULT=$?
fi
if [ $PUSH_RESULT -eq 0 ]; then
log "推送成功 → gitea/$BRANCH"
WIKI_STATUS="未执行"
if [ -x "$WIKI_SCRIPT" ]; then
if bash "$WIKI_SCRIPT" >> "$LOG_FILE" 2>&1; then
WIKI_STATUS="成功"
log "百科同步成功"
else
WIKI_STATUS="失败(百科未初始化或网络)"
log "百科同步失败"
fi
fi
# 建立推送记录
mkdir -p "$(dirname "$PUSH_LOG")"
if [ ! -f "$PUSH_LOG" ]; then
echo -e "# Gitea 推送记录\n\n> 卡若AI 有更新即同步到 open.quwanzhi.com:3000/fnvtk/karuo-ai\n\n| 时间 | 提交说明 |\n|:---|:---|" > "$PUSH_LOG"
fi
echo "| $(date '+%Y-%m-%d %H:%M:%S') | $COMMIT_MSG |" >> "$PUSH_LOG"
# 代码管理:写入本次上传(代码+百科+链接)
if [ -f "$CODE_MGMT" ]; then
echo "| $(date '+%Y-%m-%d %H:%M:%S') | 成功 | $WIKI_STATUS | $COMMIT_MSG | [仓库]($GITEA_URL) [百科]($GITEA_URL/wiki) |" >> "$CODE_MGMT"
fi
else
log "推送失败code=$PUSH_RESULT),尝试强制推送..."
git push "$REMOTE" "$BRANCH" --force --quiet 2>&1
if [ $? -eq 0 ]; then
log "强制推送成功 → gitea/$BRANCH"
WIKI_STATUS="未执行"
if [ -x "$WIKI_SCRIPT" ]; then
if bash "$WIKI_SCRIPT" >> "$LOG_FILE" 2>&1; then WIKI_STATUS="成功"; else WIKI_STATUS="失败"; fi
fi
mkdir -p "$(dirname "$PUSH_LOG")"
[ ! -f "$PUSH_LOG" ] && echo -e "# Gitea 推送记录\n\n| 时间 | 提交说明 |\n|:---|:---|" > "$PUSH_LOG"
echo "| $(date '+%Y-%m-%d %H:%M:%S') | [强制] $COMMIT_MSG |" >> "$PUSH_LOG"
if [ -f "$CODE_MGMT" ]; then
echo "| $(date '+%Y-%m-%d %H:%M:%S') | 成功(强制) | $WIKI_STATUS | $COMMIT_MSG | [仓库]($GITEA_URL) [百科]($GITEA_URL/wiki) |" >> "$CODE_MGMT"
fi
else
log "错误:强制推送也失败"
exit 1
fi
fi
exit 0