diff --git a/.gitea/workflows/update_stats_badge.yaml b/.gitea/workflows/update_stats_badge.yaml index f899483..296060e 100644 --- a/.gitea/workflows/update_stats_badge.yaml +++ b/.gitea/workflows/update_stats_badge.yaml @@ -1,4 +1,4 @@ -name: Update Stats Badege +name: 📊 代码统计徽章 on: push: @@ -117,25 +117,52 @@ jobs: echo "🌿 分支: ${{ github.ref_name }}" echo "" - # 检查仓库是否已存在 - if [ -d "$REPO_DIR/.git" ]; then - echo "✓ 仓库已存在,更新中..." - cd "$REPO_DIR" + # 检查仓库状态 + if [ -d "$REPO_DIR" ]; then + echo "📂 目录已存在,检查 Git 仓库状态..." - # 清理工作区 - git clean -fdx - git reset --hard - - # 获取最新代码 - echo "📥 拉取最新代码..." - git fetch --all --tags --force - - echo "✓ 仓库已更新" + if [ -d "$REPO_DIR/.git" ]; then + # 目录存在且是有效的 Git 仓库 + echo "✓ 发现有效的 Git 仓库,执行增量更新..." + cd "$REPO_DIR" + + # 清理工作区 + git clean -fdx + git reset --hard + + # 获取最新代码 + echo "📥 拉取最新代码..." + git fetch --all --tags --force + + echo "✓ 仓库已更新" + else + # 目录存在但不是 Git 仓库(可能之前运行失败) + echo "⚠️ 目录存在但不是有效的 Git 仓库" + echo "🧹 清理损坏的目录..." + rm -rf "$REPO_DIR" + echo "✓ 已清理" + + # 重新克隆 + echo "📥 克隆仓库..." + mkdir -p "${{ env.WORKSPACE_DIR }}" + + git clone \ + https://oauth2:${{ env.ACCESS_TOKEN }}@${GITHUB_SERVER_URL#https://}/${{ github.repository }}.git \ + "$REPO_DIR" + + if [ $? -ne 0 ]; then + echo "❌ 克隆失败" + exit 1 + fi + + cd "$REPO_DIR" + echo "✓ 仓库已克隆" + fi else - echo "📥 克隆仓库..." + # 目录不存在,首次克隆 + echo "📥 克隆仓库(首次)..." mkdir -p "${{ env.WORKSPACE_DIR }}" - # 克隆仓库(完整克隆,不使用 --depth) git clone \ https://oauth2:${{ env.ACCESS_TOKEN }}@${GITHUB_SERVER_URL#https://}/${{ github.repository }}.git \ "$REPO_DIR" @@ -220,10 +247,26 @@ jobs: cd "${{ env.REPO_DIR }}" + # 🔴 安全检查:确认在正确的目录 + echo "🔍 当前目录: $(pwd)" + echo "🔍 .git 状态: $([ -d .git ] && echo '✓ 存在' || echo '✗ 不存在')" + + if [ ! -d .git ]; then + echo "❌ 错误:.git 目录不存在,无法创建分支" + exit 1 + fi + # 创建孤立分支(orphan branch) # 📝 说明:孤立分支与主分支没有共同的提交历史,适合存储独立的数据 + echo "🌱 创建孤立分支..." git checkout --orphan ${{ env.BADGE_BRANCH }} + # 🔴 再次确认 .git 仍然存在 + if [ ! -d .git ]; then + echo "❌ 严重错误:.git 目录丢失!" + exit 1 + fi + # 🧹 清空所有文件(但保留 .git 目录) # ❓ 为什么要删除? # - stats 分支是独立的数据存储分支,不需要主分支的代码文件 @@ -234,10 +277,28 @@ jobs: # - 可以!.git 目录包含所有分支的完整信息 # - 切换到主分支时,主分支的文件会恢复 # - 各分支独立,互不影响 + + echo "🧹 清理文件(保护 .git 和 .gitea)..." + + # 步骤 1: 使用 git rm 清理已跟踪的文件 git rm -rf . 2>/dev/null || true - # 安全地删除剩余文件(排除 .git 和 .gitea) - find . -maxdepth 1 ! -name '.' ! -name '..' ! -name '.git' ! -name '.gitea' -exec rm -rf {} + 2>/dev/null || true + # 步骤 2: 安全地删除剩余文件 + # 使用更严格的保护,确保不会误删 .git + echo "🔍 查找需要删除的文件..." + find . -maxdepth 1 -type f ! -name '.gitignore' -delete 2>/dev/null || true + find . -maxdepth 1 -type d ! -name '.' ! -name '..' ! -name '.git' ! -name '.gitea' -exec rm -rf {} + 2>/dev/null || true + + # 🔴 最终检查:确认 .git 仍然完好 + echo "🔍 最终检查..." + if [ ! -d .git ]; then + echo "❌ 致命错误:.git 目录在清理过程中被删除!" + echo "这不应该发生,请检查 find 命令" + exit 1 + fi + echo "✓ .git 目录完好" + echo "✓ 文件清理完成" + echo "" # 创建初始 README cat > README.md << 'EOF'