Files
Neo-ZQYY/scripts/server/setup-server-git.py
Neo 254ccb1e77 feat: TaskSelector v2 全链路展示 + 同步检查 + MCP Server + 服务器 Git 排除
- admin-web: TaskSelector 重构为按域+层全链路展示,新增同步检查功能
- admin-web: TaskConfig 动态加载 Flow/处理模式定义,DWD 表过滤内嵌域面板
- admin-web: App hydrate 完成前显示 loading,避免误跳 /login
- backend: 新增 /tasks/sync-check 对比后端与 ETL 真实注册表
- backend: 新增 /tasks/flows 返回 Flow 和处理模式定义
- apps/mcp-server: 新增 MCP Server 模块(百炼 AI PostgreSQL 只读查询)
- scripts/server: 新增 setup-server-git.py + server-exclude.txt
- docs: 更新 LAUNCH-CHECKLIST 添加 Git 排除配置步骤
- pyproject.toml: workspace members 新增 mcp-server
2026-02-19 10:31:16 +08:00

138 lines
4.0 KiB
Python
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.
"""
服务器 Git 环境配置脚本
在服务器上首次 git clone 后运行一次,完成两件事:
1. 将 server-exclude.txt 复制到 .git/info/exclude
2. 对已 track 但服务器不需要的文件/目录设置 skip-worktree
这样 git pull 不会覆盖本地删除,也不会在工作区还原这些文件。
用法:
cd D:\\NeoZQYY\\test\\repo (或 prod\\repo)
python scripts/server/setup-server-git.py
运行后可以安全删除 export/ 等目录释放磁盘空间。
"""
import shutil
import subprocess
import sys
from pathlib import Path
REPO_ROOT = Path(__file__).resolve().parent.parent.parent
# 需要 skip-worktree 的路径前缀(已被 track 但服务器不需要)
SKIP_PREFIXES = [
"export/",
".env",
"docs/",
"tests/",
"samples/",
"infra/",
".kiro/",
".hypothesis/",
"apps/miniprogram/",
"apps/admin-web/src/",
"apps/admin-web/pnpm-lock.yaml",
"scripts/ops/",
"scripts/audit/",
"scripts/migrate/",
# 根目录散文件截图、workspace 文件等)
"coach-detail-full.png",
"customer-detail-full.png",
"perf-records-current.png",
"white-screen-debug.png",
"NeoZQYY.code-workspace",
"start-admin.bat",
".kiroignore",
]
# 完全不需要出现在服务器工作区的目录skip-worktree 后可删除释放空间)
DELETABLE_DIRS = [
"export",
"docs",
"tests",
"samples",
"infra",
".kiro",
".hypothesis",
"apps/miniprogram",
"scripts/ops",
"scripts/audit",
"scripts/migrate",
]
def copy_exclude():
"""复制排除规则到 .git/info/exclude"""
src = REPO_ROOT / "scripts" / "server" / "server-exclude.txt"
dst = REPO_ROOT / ".git" / "info" / "exclude"
dst.parent.mkdir(parents=True, exist_ok=True)
shutil.copy2(src, dst)
print(f" 已复制 {src.name} -> {dst}")
def get_tracked_files(prefix: str) -> list[str]:
"""获取匹配前缀的已 track 文件列表"""
result = subprocess.run(
["git", "ls-files", "--", prefix],
capture_output=True, text=True, cwd=REPO_ROOT,
)
return [f for f in result.stdout.strip().split("\n") if f]
def skip_worktree(files: list[str]):
"""对文件列表设置 skip-worktree 标记"""
if not files:
return
# git update-index 一次处理的文件数有限,分批
batch_size = 50
for i in range(0, len(files), batch_size):
batch = files[i:i + batch_size]
subprocess.run(
["git", "update-index", "--skip-worktree"] + batch,
cwd=REPO_ROOT,
)
def main():
print("=== 服务器 Git 环境配置 ===\n")
# 1. 复制 exclude 规则
print("[1/3] 配置 .git/info/exclude ...")
copy_exclude()
# 2. 设置 skip-worktree
print("\n[2/3] 设置 skip-worktree已 track 但服务器不需要的文件)...")
total_skipped = 0
for prefix in SKIP_PREFIXES:
files = get_tracked_files(prefix)
if files:
skip_worktree(files)
total_skipped += len(files)
print(f" {prefix} -> {len(files)} 个文件已标记")
else:
print(f" {prefix} -> 无匹配文件")
print(f" 共标记 {total_skipped} 个文件")
# 3. 提示可删除的目录
print("\n[3/3] 以下目录已标记 skip-worktree可安全删除以释放磁盘空间")
for d in DELETABLE_DIRS:
dir_path = REPO_ROOT / d
if dir_path.exists():
# 计算目录大小
size = sum(f.stat().st_size for f in dir_path.rglob("*") if f.is_file())
size_mb = size / (1024 * 1024)
print(f" {d}/ ({size_mb:.1f} MB)")
else:
print(f" {d}/ (不存在,无需处理)")
print("\n如需删除,手动执行:")
for d in DELETABLE_DIRS:
print(f" rmdir /s /q {d}")
print("\n配置完成。后续 git pull 不会还原这些文件。")
if __name__ == "__main__":
main()